【问题标题】:Change sheet names in SAS ODS dynamically动态更改 SAS ODS 中的工作表名称
【发布时间】:2016-12-07 08:57:32
【问题描述】:

有没有办法使用宏动态更改 SAS ODS 中的工作表名称?在宏中,我有以下代码:

    %DO N = 1 %TO &SQLOBS;

    ODS TAGSETS.ExcelXP 
        OPTIONS(SHEET_NAME = &&TABLEVAR&N
                EMBEDDED_TITLES = 'NO'
                EMBEDDED_FOOTNOTES = 'NO'
                PRINT_HEADER = 'CURRENT &&TABLEVAR&N AS OF &D';

    PROC PRINT 
        DATA = WORK.&&TABLEVAR&N
        NOOBS;

    RUN; 

    %END;

这基本上循环通过一组表名,并为每个表输出一个单独的 Excel 表。并且通过调用宏变量 &TABLEVAR,它应该动态地更改每个表的工作表名称。但是,我收到以下错误:

错误 22-322:需要一个带引号的字符串。

所以 SAS 确实解析了宏变量,我可以在日志中看到表名是正确的,但问题是它们不是带引号的字符串。所以我尝试了这样的方法,并在其周围加上引号:

OPTIONS(SHEET_NAME = '&&TABLEVAR&N'

但随后 SAS 未解析宏变量,所有工作表都命名为 &&TABLEVAR&1、2 等。

有没有办法解决这个问题? (而且每张工作表都是一个名称不同的单独表格,所以我不能使用 BY 组。)如果它们不能与 ODS 交互,那么有什么好的宏?

【问题讨论】:

    标签: excel macros sas proc sas-macro


    【解决方案1】:

    我刚刚发现将 %sysfuncquote 放在 &&TABLEVAR&N 前面可以解决问题。

    所以最终的代码是这样的:

     %DO N = 1 %TO &SQLOBS;
    
    ODS TAGSETS.ExcelXP 
        OPTIONS(SHEET_NAME = %sysfunc(quote(&&TABLEVAR&N))
                EMBEDDED_TITLES = 'NO'
                EMBEDDED_FOOTNOTES = 'NO'
                PRINT_HEADER = 'CURRENT &&TABLEVAR&N AS OF &D';
    
    PROC PRINT 
        DATA = WORK.&&TABLEVAR&N
        NOOBS;
    
    RUN; 
    
    %END;
    

    【讨论】:

    • 您是否还应该对 PRINT_HEADER 选项使用双引号,以便打印宏变量的值而不仅仅是其名称?
    【解决方案2】:

    我认为你不需要所有这些。如果您在宏变量表达式周围使用双引号,您应该得到与%SYSFUNC(QUOTE()) 函数相同的结果:

    "&&TABLEVAR&N"
    

    也就是说,除非您以某种方式计划在工作表名称中使用双引号......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      相关资源
      最近更新 更多