我编写了一个宏 %xl 来从具有特定格式的数据集中打印 Excel 文件。它本身工作正常。但是,宏需要title
临时设置。我可以清除宏末尾的标题,但我真的想保留宏前的标题并将其恢复为我宏的最后一步。
如何将当前值捕获title
到宏变量中?与带有选项的 %sysfunc(GetOption()) 类似。
谢谢,PT
可以使用 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 系统函数。这已经多次提出“功能要求”,但从未实施。
似乎不是首先设置标题然后尝试从中创建宏变量,而是最好先设置一个宏变量(或者如果您要重复使用多个不同的标题,则设置多个),然后在标题语句中使用它,如下所示:
%let title_text = "This is my pre-macro title";
/* Set title first time. */
title "&title_text";
/* Call macro. */
%xl;
/* Restore title. */
title "&title_text";
如果您有 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";