1

我编写了一个宏 %xl 来从具有特定格式的数据集中打印 Excel 文件。它本身工作正常。但是,宏需要title临时设置。我可以清除宏末尾的标题,但我真的想保留宏前的标题并将其恢复为我宏的最后一步。

如何将当前值捕获title到宏变量中?与带有选项的 %sysfunc(GetOption()) 类似。

谢谢,PT

4

3 回答 3

4

可以使用 SASHELP.VTITLE 视图检索标题和脚注。所以我会用它来保存当前值,运行你的程序,然后运行另一个步骤来使用 重置标题call execute,如下所示:

data _old_titles;
  set sashelp.vtitle;
run;

/* do something */
footnote;
title;

/* reset titles and footnotes */
data _null_;
   set _old_titles;
   if type = 'T'
      then cmd = catt('title',number," '",trim(text)," ';");
      else cmd = catt('footnote',number," '",trim(text)," ';");
  call execute(cmd);
run;

请注意,在值之后使用了一个额外的空格text来防止两个连续的撇号,这将转换为单引号。也不使用单引号来防止任何不需要的宏扩展。

不完美,但请记住,您可以有许多标题和脚注,因此很难创建选项或 SAS 系统函数。这已经多次提出“功能要求”,但从未实施。

于 2013-09-10T21:34:22.007 回答
0

似乎不是首先设置标题然后尝试从中创建宏变量,而是最好先设置一个宏变量(或者如果您要重复使用多个不同的标题,则设置多个),然后在标题语句中使用它,如下所示:

%let title_text = "This is my pre-macro title";

/* Set title first time. */
title "&title_text";

/* Call macro. */
%xl;

/* Restore title. */
title "&title_text";
于 2013-09-10T16:34:31.497 回答
0

如果您有 SAS/AF 许可,您可以创建一个 SCL 程序来做您想做的事。按照此处有关创建 SCL 程序的说明进行操作。

在您想要的 SCL 程序(我命名为 gettitle.scl)中

init:                                  
   call symput('TitleOld',gettitle(1));                                  
return;

编译后你可以这样调用它

title "whatever it happens to be";
proc display c=myscl.catalog.gettitle.scl; run;

%xl;

title "&TitleOld";
于 2013-09-10T17:04:22.280 回答