如何通过变量将值传递给sas中的宏

如何通过变量将值传递给sas中的宏,sas,sas-macro,Sas,Sas Macro,这是我的密码 %macro redemptions1(startdate, enddate, sd, ed, sunday1, sunday2); data _null_; %put &startdate; run; %mend redemptions1; data _null_; format tday date9.; format sd date9.; format ed date9.; tday=today(); if weekday(tday) = 1 then do; ed

这是我的密码

%macro redemptions1(startdate, enddate, sd, ed, sunday1, sunday2);
data _null_;
%put &startdate;
run;

%mend redemptions1;
data _null_;
format tday date9.;
format sd date9.;
format ed date9.;
tday=today();
if weekday(tday) = 1 then do; ed = intnx('day',tday,-9); sd = intnx('day',tday,-15);end;
if weekday(tday) = 2 then do; ed = intnx('day',tday,-3); sd = intnx('day',tday,-9);end;
if weekday(tday) = 3 then do; ed = intnx('day',tday,-4); sd = intnx('day',tday,-10);end;
if weekday(tday) = 4 then do; ed = intnx('day',tday,-5); sd = intnx('day',tday,-11);end;
if weekday(tday) = 5 then do; ed = intnx('day',tday,-6); sd = intnx('day',tday,-12);end;
if weekday(tday) = 6 then do; ed = intnx('day',tday,-7); sd = intnx('day',tday,-13);end;
if weekday(tday) = 7 then do; ed = intnx('day',tday,-8); sd = intnx('day',tday,-14);end;
startdate = (year(sd) - 1900) * 10000 + month(sd) * 100 + day(sd);
enddate = (year(ed) - 1900) * 10000 + month(ed) * 100 + day(ed);
sunday1 = year(intnx('day',sd,-6))*10000+month(intnx('day',sd,-6))*100+day(intnx('day',sd,-6));
sunday2 = year(intnx('day',sd,1))*10000+month(intnx('day',sd,1))*100+day(intnx('day',sd,1));
%redemptions1(startdate,enddate,sd,ed,sunday1,sunday2); 
run;
如果我通过变量startdate、enddate等传递值,redemptions1宏只打印“startdate”,而不是实际打印startdate的值。如何让它打印变量中包含的值


谢谢

您需要将对宏的调用构造为文本字符串,然后告诉SAS使用
call execute
DOSUBL
函数执行它

宏调用上的参数必须是提供所需值的文本。数据步骤中的调用将启动
%redemptions1(startdate,
),因此第一个参数是文本
startdate
,这就是宏打印的内容。相反,您可以执行以下操作:

myCall = '%redemptions1(' || startdate || ')';
call execute(myCall);
这构造了必要的调用,比如
%redemptions1(09MAR2017)
,然后执行它。当然,您可以在一行中执行此操作:

call execute('%redemptions1(' || startdate || ')');
当然,您需要填写其他参数的值


顺便说一句,您的日期计算看起来有点粗略-
startdate
enddate
可能不包含您认为它们包含的值。请查看
dhms
函数,看看这是否有帮助。您正在为今天的日期创建一个类似“1170309”的数字-一百万、十七万、三百零九。年份值非常高奇怪-你真的想要117(2017-1900)?如果您要求SAS将该值作为日期处理,它会将其视为自1960年1月1日起的天数,这将是未来的某个日期方式。

感谢您的回复,Chris。我确实尝试了上述方法,但它显示变量未初始化。我试图通过调用execute将startdate放入宏中,但它抛出了错误或“变量未初始化”.W.r.t日期,是的,我正在寻找特定的格式,因为我的数据集需要它。什么是“变量未初始化”?确保调用执行是数据步骤的一部分,即在最后的“运行;”之前。在宏中,可以删除“data null;”和“run;”行,只保留“%put”语句,但我不希望看到任何其他消息。尝试两行版本的CALL EXECUTE并添加一行“put myCall=;”,以确认正在执行的内容。设置选项MPRINT SYMBOLGEN也可能有助于诊断问题。