The RUN statement is crucial. It forces the DATA step to run, thus creating the macro variables used in the CALL SYMPUT statements before the %DO loop, which uses them, executes.
   run;