sas宏调用宏

sas宏调用宏,sas,sas-macro,Sas,Sas Macro,嗨,我有一个程序可以用一个宏调用另一个宏 我有两个月(6月12日和7月12日),每个月有两个部分(1和2),我想做一个循环,我构造了一个名为“循环”的宏,在它里面,我构造了一个数组,并使用do comment do调用一个宏“try” 好像没用。有人能帮我吗?谢谢大家! LIBNAME EC100006 "G:\sample"; %MACRO try(month=,part=); ...FROM EC100006.monthitsum&month.lag&part

嗨,我有一个程序可以用一个宏调用另一个宏

我有两个月(6月12日和7月12日),每个月有两个部分(1和2),我想做一个循环,我构造了一个名为“循环”的宏,在它里面,我构造了一个数组,并使用do comment do调用一个宏“try”

好像没用。有人能帮我吗?谢谢大家!

 LIBNAME EC100006 "G:\sample";
%MACRO try(month=,part=);
      ...FROM EC100006.monthitsum&month.lag&part AS t1
%MEND try;

%Macro test;
    ARRAY Mon(2) jun12 jul12;
    %Do i=1 %to 2;
        %Do j=1 %to 2
            %try(month=Mon(i),part=j)
        %End
    %End
%Mend test;

%test

不能有宏变量数组

重复调用带有参数列表的宏的最简单方法是使用这些参数创建一个数据集,并从数据集中调用它,可以使用call EXECUTE,也可以使用PROC SQL创建宏调用的宏列表

data call;
input month $ part;
datalines;
jun12 1 
jul12 2
;;;;
run;

proc sql;
select cats('%try(month=',month,',part=',part,')') into :mcalllist 
  separated by ' ' 
  from call;
quit;

&mcalllist;

这只在调用少于20000个字符的情况下才有效——如果超过20000个字符,则需要尝试其他选项(%include file或call execute)。

所以现在是这样的

LIBNAME EC100006 "G:\sample";
%MACRO try(month=,part=);
  ...FROM EC100006.monthitsum&month.lag&part AS t1
%MEND try;

Data Array
ARRAY Mon{2} jun12 jul12;
RUN;
%Macro test;
    %Do i=1 %to 2;
    %Do j=1 %to 2
        %try(month=Mon(i),part=j)
    %End
%End
%Mend test;

%test

这里有
数组
,但没有关联的数据集?您是否正在尝试从其他数据集中检索值(2012年6月12日至7月12日)?另外,当您引用宏变量时,请尝试(month=Mon(&i),part=&j)。谢谢!我用了你的代码和我的try宏,似乎它不能读取输入文件。日志错误如下所示:行由宏变量“PART”生成。1 EC100002..u al_1_part_1_lag--22 200错误22-322:需要一个名称。错误200-322:符号无法识别,将被忽略。除了更正示例数据集中的input语句以包含$after month之外,示例代码按预期工作。您发布的错误通常表明您的代码中缺少了其他内容,因为这意味着它正在命中数据步骤代码或数据步骤之外的其他内容-也许您需要将&mcalllist调用放在进程或数据步骤中?因此,请说“少于20000个字符的调用”,您的意思是数据集大小不能超过20000个字符吗?如果我想让程序更自动化。换句话说,用户只需告诉程序开始月份和结束月份,程序就可以自动执行循环?例如,我告诉这个计划,开始的月份是五月,结束的月份是八月,每个月有两部分。我需要构造一个月库并对它们进行排序吗?不需要。您在这里要做的是构造一个宏变量,它包含
%try(x,y)%try(a,b)%try(d,f)
。该宏变量的最大大小为20000个字符。因此,如果每个调用的长度约为20个字符,那么在该宏变量中最多可以有1000个不同的调用。如果发生这种情况,你会得到警告。使用宏调用的数据集大小并不重要。如果希望以编程方式执行此操作,则需要构造一个与要调用的数据集匹配的数据集-我认为,您可以要求用户执行此操作。但是,您也可以指示外部宏来创建它-但不是使用宏代码,而是使用宏内部的普通数据步骤。