如何将宏函数的结果分配给SAS中的宏变量?

Jay*_*ett 2 sas sas-macro

我有一个宏创建一个时间戳(附加到输出文件名).但是,我宁愿将宏变量分配给宏的结果(如果它不够圆),而不是必须记住宏赋值的宏变量.

%let tms= %tms();
Run Code Online (Sandbox Code Playgroud)

这是当前的宏....

%macro tms ;
    %* Create a Timestamp ;
 %let tms_date= %sysfunc(date(),yymmdd10.) ;  %* Todays date ;
 %let tms_time= %sysfunc(time(),time.) ;      %* Current Time ;

    %* Format mmddyyhhmmss ;
 %let tms=_%scan(&tms_date,1)%scan(&tms_date,2)%scan(&tms_date,3)%scan(&tms_time,1,:)%scan(&tms_time,2,:)%scan(&tms_time,3,:) ;

%mend ;
Run Code Online (Sandbox Code Playgroud)

你怎么引用它来使它工作?另外,我只是从宏中删除"%let tms ="吗?

此外,以下ODS转让声明的引用是否相同?

ods Tagsets.excelxp file="&outname.&tms..xml" style= Styles.XLsansPrinter ;
Run Code Online (Sandbox Code Playgroud)

感谢您抽出宝贵的时间....

cmj*_*hns 6

具有返回值的宏通常称为宏函数.在修复声明之前,如果你输入一个没有分号的表达式/值,它会将值返回给调用者.如果返回值在if-else块中,则; 是必要的.

基本上,您可以按照建议执行操作,并从宏内删除%let tms =.是的,我相信它会与ods赋值声明一起使用.

%macro tms ;
    %* Create a Timestamp ;
 %let tms_date= %sysfunc(date(),yymmdd10.) ;  %* Todays date ;
 %let tms_time= %sysfunc(time(),time.) ;      %* Current Time ;

        %* Format mmddyyhhmmss ;
 _%scan(&tms_date,1)%scan(&tms_date,2)%scan(&tms_date,3)%scan(&tms_time,1,:)%scan(&tms_time,2,:)%scan(&tms_time,3,:) 
%mend;
%let tms=%tms;
%put **&tms**;
Run Code Online (Sandbox Code Playgroud)

作为另一个建议,您可以通过使用%scan函数的compress函数insead来稍微简化代码

%sysfunc(compress(_&tms_date.&tms_time,"-:"));
Run Code Online (Sandbox Code Playgroud)