Hi Rob, I think you've mixed up how the SAS macro processor works. In your code you're running your macro inside a datastep. I can understand why you'd have wanted to do this in order to run CreateChurn() with the values required. However, SAS's macro's aren't like a function or procedure in a conventional programming language. It's perhaps closer to the #define directive in C/C++ (although more complex) in that the macro pre-processor, which runs before your data steps are run, executes your macro code and returns the results as text which are then processed like any other code. This ends up meaning your code tries to run a data step inside another data step, which will not work or do as you expect. (I tried to write up the equivalent output in code, but even a simple example ended up being quite long.) The two simplest solutions are to either use Call Execute as you mentioned, or simply move the "loop" function to the macro itself and run the macro once. As a simple example of the macro version, please see below: %macro runme(); %do i=1 %to 10; data test_&i.; var = i; run; %end; %mend; %runme(); This uses the macro processer to run the loop from 1 to 10, and creates 10 datasets with one row named Test_1 to Test_10. I hope that's enough to help you make some progress!
... View more