2

我有一个创建时间戳的宏(附加到输出文件名)。但是,与其记住宏将值分配给哪个宏变量,我更愿意将宏变量分配给宏的结果(如果这还不够循环的话)。

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

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

4

1 回答 1

6

具有返回值的宏通常称为宏函数。在 mend 语句之前,如果您放置一个不带分号的表达式/值,它将将该值返回给调用者。如果返回值在 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**;

作为另一个建议,您可以通过使用 compress 函数而不是 %scan 函数来稍微简化代码,如下所示

%sysfunc(compress(_&tms_date.&tms_time,"-:"));
于 2009-05-27T19:01:03.260 回答