存储当前SAS标题,临时更改它,并在宏结束时恢复它
我编写了一个宏%xl,用于从具有特定格式的数据集打印Excel文件。它本身运行良好。但是,宏需要临时设置存储当前SAS标题,临时更改它,并在宏结束时恢复它,sas,sas-macro,Sas,Sas Macro,我编写了一个宏%xl,用于从具有特定格式的数据集打印Excel文件。它本身运行良好。但是,宏需要临时设置标题。我可以在宏结束时清除标题,但我确实希望保留宏前的标题,并将其恢复为宏的最后一步 如何将title的当前值捕获到宏变量中?类似于%sysfunc(GetOption()),带有选项 谢谢, pT与其先设置标题,然后再尝试从中创建宏变量,不如先设置一个宏变量(如果要重复使用多个不同的标题,则设置多个),然后在title语句中使用,如下所示: %let title_text = "This i
标题
。我可以在宏结束时清除标题,但我确实希望保留宏前的标题,并将其恢复为宏的最后一步
如何将title
的当前值捕获到宏变量中?类似于%sysfunc(GetOption()),带有选项
谢谢,
pT与其先设置标题,然后再尝试从中创建宏变量,不如先设置一个宏变量(如果要重复使用多个不同的标题,则设置多个),然后在title语句中使用,如下所示:
%let title_text = "This is my pre-macro title";
/* Set title first time. */
title "&title_text";
/* Call macro. */
%xl;
/* Restore title. */
title "&title_text";
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;
与其先设置标题,然后尝试从中创建宏变量,不如先设置一个宏变量(如果有多个不同的标题需要重复使用,则设置多个),然后在title语句中使用,如下所示:
%let title_text = "This is my pre-macro title";
/* Set title first time. */
title "&title_text";
/* Call macro. */
%xl;
/* Restore title. */
title "&title_text";
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;
如果您拥有SAS/AF许可证,您可以创建SCL程序来执行您想要的操作。按照有关创建SCL程序的说明进行操作 在您的SCL程序中(我将我的命名为gettitle.SCL),您需要 编译后,可以这样调用它
title "whatever it happens to be";
proc display c=myscl.catalog.gettitle.scl; run;
%xl;
title "&TitleOld";
如果您拥有SAS/AF许可证,您可以创建SCL程序来执行您想要的操作。按照有关创建SCL程序的说明进行操作 在您的SCL程序中(我将我的命名为gettitle.SCL),您需要 编译后,可以这样调用它
title "whatever it happens to be";
proc display c=myscl.catalog.gettitle.scl; run;
%xl;
title "&TitleOld";
可以使用SASHELP.VTITLE视图检索标题和脚注。因此,我将使用它来保存当前值,运行程序,然后运行另一个步骤,使用
调用execute
重置标题,如下所示:
%let title_text = "This is my pre-macro title";
/* Set title first time. */
title "&title_text";
/* Call macro. */
%xl;
/* Restore title. */
title "&title_text";
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;
请注意,文本
值后面有一个额外的空格,用于防止两个连续的撇号,这将转换为单个引号。也不要使用单引号来防止任何不必要的宏扩展
不完美,但请记住,您可以有许多标题和脚注,因此很难创建选项或SAS系统函数。这是一个“功能请求”多次,但从未实现。可以使用SASHELP.VTITLE视图检索标题和脚注。因此,我将使用它来保存当前值,运行程序,然后运行另一个步骤,使用
调用execute
重置标题,如下所示:
%let title_text = "This is my pre-macro title";
/* Set title first time. */
title "&title_text";
/* Call macro. */
%xl;
/* Restore title. */
title "&title_text";
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;
请注意,文本
值后面有一个额外的空格,用于防止两个连续的撇号,这将转换为单个引号。也不要使用单引号来防止任何不必要的宏扩展
不完美,但请记住,您可以有许多标题和脚注,因此很难创建选项或SAS系统函数。这已经是一个“功能请求”多次,但从未实现过。我同意这是可行的,但它需要外部代码知道宏将更改标题。我正在寻找一种完全可以在%xl中编写的方法,以便(现有)外部代码可以像在添加对%xl的调用之前那样工作。我同意这是可行的,但需要外部代码知道宏将更改标题。我正在寻找一种完全可以在%xl中编写的方法,以便(现有)外部代码可以像添加对%xl的调用之前那样工作。老实说,
title
不是我认为用户应该保持不变的东西。每个进程运行都应该有自己的标题语句;如果您有一个标题或标题的一部分想要保持一致,请将其保存在宏变量中。老实说,title
不是我认为用户应该保持不变的东西。每个进程运行都应该有自己的标题语句;如果有一个标题或部分标题需要一致,请将其保存在宏变量中。