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

时间:2009-05-27 16:52:36

标签: sas sas-macro

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

%let tms= %tms();

这是当前的宏....

%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 ;

你如何引用它以使其有效? 另外,我只是从宏中删除“%let tms =”吗?

此外,相同的引用是否适用于以下ODS分配声明?

ods Tagsets.excelxp file="&outname.&tms..xml" style= Styles.XLsansPrinter ;

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

1 个答案:

答案 0 :(得分: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**;

作为另一个建议,您可以通过使用%scan函数的压缩函数insead来简化代码,如下所示

%sysfunc(compress(_&tms_date.&tms_time,"-:"));