存储当前SAS标题,临时更改它,并在宏结束时恢复它

存储当前SAS标题,临时更改它,并在宏结束时恢复它,sas,sas-macro,Sas,Sas Macro,我编写了一个宏%xl,用于从具有特定格式的数据集打印Excel文件。它本身运行良好。但是,宏需要临时设置标题。我可以在宏结束时清除标题,但我确实希望保留宏前的标题,并将其恢复为宏的最后一步 如何将title的当前值捕获到宏变量中?类似于%sysfunc(GetOption()),带有选项 谢谢, pT与其先设置标题,然后再尝试从中创建宏变量,不如先设置一个宏变量(如果要重复使用多个不同的标题,则设置多个),然后在title语句中使用,如下所示: %let title_text = "This i

我编写了一个宏%xl,用于从具有特定格式的数据集打印Excel文件。它本身运行良好。但是,宏需要临时设置
标题
。我可以在宏结束时清除标题,但我确实希望保留宏前的标题,并将其恢复为宏的最后一步

如何将
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
不是我认为用户应该保持不变的东西。每个进程运行都应该有自己的标题语句;如果有一个标题或部分标题需要一致,请将其保存在宏变量中。