Can someone help write a macro do loop for the following scenario, please? Rather than doing it manually line-by-line, it would be great if this can be done using a macro. Thanks
%Let M0=Start_Date+28;
%Let M1=Start_Date+56;
%Let M2=Start_Date+84;
%Let M3=Start_Date+112;
%Let M4=Start_Date+140;
%Let M5=Start_Date+168;
%Let M6=Start_Date+196;
%Let M7=Start_Date+224;
%Let M8=Start_Date+252;
%Let M9=Start_Date+280;
%Let M10=Start_Date+308;
%Let M11=Start_Date+336;
%Let M12=Start_Date+364;
%Let M13=Start_Date+392;
%Let M14=Start_Date+420;
%Let M15=Start_Date+448;
%Let M16=Start_Date+476;
%Let M17=Start_Date+504;
%Let M18=Start_Date+532;
%Let M19=Start_Date+560;
%Let M20=Start_Date+588;
While I'm not certain that the result you describe is the result that you want, it is relatively straightforward to produce:
%macro loop28;
%local i;
%do i=0 %to 20;
%global m&i;
%let m&i = Start_Date+%eval(28 + 28*&i);
%end;
%mend loop28;
%loop28
While I'm not certain that the result you describe is the result that you want, it is relatively straightforward to produce:
%macro loop28;
%local i;
%do i=0 %to 20;
%global m&i;
%let m&i = Start_Date+%eval(28 + 28*&i);
%end;
%mend loop28;
%loop28
Thank you so much. This is exactly what I need.
Is your 28 day increment intended to be one month? I assume it is. You might want to use the "sameday" option of function INTNX which will be a lot more precise. I've written a macro to just that which I will include below. I've written another macro to write the results to the log. In the log, we can see that I'm incrementing a full month each time, regardless of whether a month is 28, 29, 30, or 31 days long. Such is the power of INTNX.
Jim
%LET Start_Date = '01JAN2021'd;
**------------------------------------------------------------------------------**;
%MACRO Months_Loop(Start_Date, Nbr_of_Months=20);
%LOCAL i j Temp_Date;
%GLOBAL M0;
%LET M0 = %QSYSFUNC(STRIP(%QSYSFUNC(PUTN(&Start_Date, 9.))));
%DO i = 1 %TO &Nbr_Of_Months;
%GLOBAL M&i;
%LET j = %EVAL(&i - 1);
%LET M&i = %QSYSFUNC(INTNX(month,&&M&j,1,sameday));
%END;
%MEND Months_Loop;
%Months_Loop(&Start_Date);
**------------------------------------------------------------------------------**;
%MACRO Display_Months(Nbr_of_Months=20);
%LOCAL i;
%LOCAL Formatted_Date;
%DO i = 0 %TO &Nbr_of_Months;
%LET Formatted_Date = %QSYSFUNC(PUTN(&&M&i, DATE9.));
%PUT NOTE: Month &i = &&M&i (&Formatted_Date);
%END;
%MEND Display_Months;
%Display_Months;
Results:
NOTE: Month 0 = 22281 (01JAN2021) NOTE: Month 1 = 22312 (01FEB2021) NOTE: Month 2 = 22340 (01MAR2021) NOTE: Month 3 = 22371 (01APR2021) NOTE: Month 4 = 22401 (01MAY2021) NOTE: Month 5 = 22432 (01JUN2021) NOTE: Month 6 = 22462 (01JUL2021) NOTE: Month 7 = 22493 (01AUG2021) NOTE: Month 8 = 22524 (01SEP2021) NOTE: Month 9 = 22554 (01OCT2021) NOTE: Month 10 = 22585 (01NOV2021) NOTE: Month 11 = 22615 (01DEC2021) NOTE: Month 12 = 22646 (01JAN2022) NOTE: Month 13 = 22677 (01FEB2022) NOTE: Month 14 = 22705 (01MAR2022) NOTE: Month 15 = 22736 (01APR2022) NOTE: Month 16 = 22766 (01MAY2022) NOTE: Month 17 = 22797 (01JUN2022) NOTE: Month 18 = 22827 (01JUL2022) NOTE: Month 19 = 22858 (01AUG2022) NOTE: Month 20 = 22889 (01SEP2022)
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.