augustin4 发表于 2014-10-23 23:49 
谢谢你帮我回答问题!
但关于宏我还是有一点问题想请教你:
1,%do 循环可不可以不加%to, 像数据步那样 ...
两个问题,咱们一一解释一下:
1.%do是否可以像do那样直接使用 :
这个问题的答案会让楼主失望:不能。%do必须和%to搭配
但是也有一些变通的方式,比如 :
- %let mvar1 = A;
- %let mvar2 = B;
- %let mvar3 = C;
- %macro example;
- %do i = 1 %to 3;
- %put mvar&i = &&mvar&i;
- %end;
- %mend example;
- %example;
复制代码或者
- %let list_of_values = A B C;
- %macro example2;
- %do i = 1 %to 3;
- %let mvar = %scan(&list_of_values, &i, %str( ));
- %put mvar = &mvar;
- %end;
- %mend example2;
- %example2;
复制代码2.关于一组数据集的调用
请楼主运行想像一下代码运行的效果:
- %macro names(name, number);
- %do n=1 %to &number;
- &name&n
- %end;
- %mend names;
- data %names(dsn, 5);
- run;
复制代码这段代码可以自动生成dsn1 - dsn5一共五个数据集,对不对,语法上data后面是可以写入多个数据集的。
楼主想要将这个宏应用于proc部,当然是可以的,但是前提是,用的地方必须支持多个数据集作为参数,比如:
- proc datasets;
- delete
- %names(dsn, 5)
- ;
- run;
- quit;
复制代码这样就会将DSN1 - DSN5删除掉。
但是楼主要用的那个地方是proc reg后面的data =, 据我所知,这个后面只需放一个数据集的名字吧?所以楼主的那个用法,不可以的。