尝试创建一个宏来检查宏变量是否存在,如果不存在则创建它

问题描述 投票:0回答:3
%Macro symexistchk(valuex);
                %if %symexist(&valuex) %then %put &valuex;
                    %else %do; %let valuex = 0;
                            %end;
%Mend symexistchk;

%symexistchk(g900_r);

我想检查宏变量 g900_r 是否存在,如果不存在则创建一个。

谢谢, 萨姆.

sas sas-macro
3个回答
4
投票

你几乎已经拥有了它......你错过了 2 个关键的东西。 您需要包含 %global 语句来将宏声明为全局宏变量。 这将使其在宏之外可用。 您还缺少 %let 语句中的

&
,您将其分配为零。

你的最终代码应该是这样的:

%Macro symexistchk(valuex);

  %if %symexist(&valuex) %then %do;
    %put Macro Variable &valuex exists.;
  %end;
  %else %do; 
    %global &valuex;
    %let &valuex = 0;  * NOTE THE AMPERSAND TO THE LEFT OF THE EQUALS SIGN;
    %put Macro Variable &valuex created and initialized to zero.;
  %end;
%Mend symexistchk;

%symexistchk(g900_r);
%put &g900_r;

1
投票

您需要使用

%global
将新创建的宏分配给全局范围,在
%let
语句中解析您的宏变量参数(这样您不只是创建一个名为 valuex 的变量)并评估已解析的宏变量在您的
%put
声明中使用
&&&

%macro symexistchk(valuex);
    %if %symexist(&valuex.) %then %put Already exists: &valuex = &&&valuex;
    %else %do;
        /* Make macro variable available outside macro */
        %global &valuex.;
        %let &valuex. = 0;
        %put Assigning: &valuex = &&&valuex;
    %end;
%mend symexistchk;
%symexistchk(mVar);
%symexistchk(mVar);

0
投票

要添加更新,因为这个问题已在 2015 年得到答复,从 SAS9.4M5 开始,这可以通过开放代码完成。 https://blogs.sas.com/content/sasdummy/2018/07/05/if-then-else-sas-programs/

%if not(%symexist(g900_r)) %then %do; %let g900_r=0; %end;

© www.soinside.com 2019 - 2024. All rights reserved.