Sas 带有proc表格的宏

Sas 带有proc表格的宏,sas,sas-macro,Sas,Sas Macro,我想写一个代码,在特定条件下,不同的进程表将被执行。问题出在宏内部的某个地方。没有变化,一切都很好。 代码的想法很简单,但这是我第一次做这样的事情。根据数据makro中的值x,将执行不同的宏。我不知道如何在宏中定义变量 data makro; set number; if number < 20 then x=1; else x=2; run; proc format; value temp 70- HIGH='red'; run; PROC SQL; CREATE TAB

我想写一个代码,在特定条件下,不同的进程表将被执行。问题出在宏内部的某个地方。没有变化,一切都很好。 代码的想法很简单,但这是我第一次做这样的事情。根据数据makro中的值x,将执行不同的宏。我不知道如何在宏中定义变量

data makro;
set number;
if number < 20 then x=1; 
else x=2;
run;

  proc format;
value temp 70- HIGH='red';
run;

PROC SQL;
   CREATE TABLE Stat_for_&cel AS 
   SELECT distinct t1.&zmienna, 
          t1.&cel,
t2.number,
               (COUNT(t1.cid)) AS ILE
      FROM zrodlo.abt_app t1 left join ile_zmiennych t2 on t1.&zmienna=t2.&zmienna where t1.&zmienna not is missing 
      GROUP BY t1.&zmienna,
               t1.&cel
      ORDER BY t1.&zmienna DESC;
QUIT;

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);

proc format;
value temp 70- HIGH='red';
run;

PROC TABULATE
DATA= &&Stat_for_&cel format=commax10.2 ; 

    VAR &&ILE;

    CLASS &&zmienna/ MISSING;
    CLASS &&cel/ MISSING;

    TABLE 

    /* Row Dimension */
&&cel,
/* Column Dimension */
&&ILE*  ColPctSum*    &&zmienna*[style=[background=temp.]];

RUN;
%mend tabelka1; 

data makro_2;
set makro;
if x=1 then call execute ('%tabelka1');
run;
%macro tabelka1;
proc format;
value temp 70- HIGH='red';
run;

PROC TABULATE DATA=Stat_for_&cel format=commax10.2 ; 
  VAR &ILE;
  CLASS &zmienna/ MISSING;
  CLASS &cel/ MISSING;
  TABLE &cel,&ILE*ColPctSum*&zmienna*[style=[background=temp.]];
RUN;
%mend tabelka1;
编辑:添加“答案”中的信息,因为它不是答案


代码应该是这样工作的&Cel和&zmienna只是我想在proc tablate过程中使用的变量,它们是在代码开头手动定义的。当'number'为时,我只想运行一次宏。我认为您在宏的定义中混淆了参数,然后才是实际用法。您的宏定义不正确。而不是:

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);
应该是:

%macro tabelka1(Statystyka_dla_cel,ILE,cel,zmienna);
然后,当您调用宏或尝试使用它时,可以传递宏变量

%tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);
就我个人而言,我更喜欢使用一个=符号来帮助突出显示所使用的参数名称和值之间的差异。下面是一个简单的例子:

 %macro print_vars(dsin= , vars= );

 proc print data=&dsin;
 var &vars;
 run;

 %mend;
然后您可以将宏调用为:

%print_vars(dsin=sashelp.class, vars= name age);

清楚地理解各种术语的含义是非常重要的。宏变量是具有名称和值的数据存储位置。宏变量名类似于“ile”、“cel”等,但要明确的是,宏变量的名称不包括符号!!有多种方法可以访问宏变量的值,所有这些方法都涉及使用其名称。最常用的方法是使用&,但您也可以在数据步骤x=symget中使用,例如-此处不使用符号和。

定义不带任何参数的宏没有任何错误。您只需在宏代码中引用宏变量,并将其留给宏的用户,以确保在调用宏之前定义了宏变量

data makro;
set number;
if number < 20 then x=1; 
else x=2;
run;

  proc format;
value temp 70- HIGH='red';
run;

PROC SQL;
   CREATE TABLE Stat_for_&cel AS 
   SELECT distinct t1.&zmienna, 
          t1.&cel,
t2.number,
               (COUNT(t1.cid)) AS ILE
      FROM zrodlo.abt_app t1 left join ile_zmiennych t2 on t1.&zmienna=t2.&zmienna where t1.&zmienna not is missing 
      GROUP BY t1.&zmienna,
               t1.&cel
      ORDER BY t1.&zmienna DESC;
QUIT;

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna);

proc format;
value temp 70- HIGH='red';
run;

PROC TABULATE
DATA= &&Stat_for_&cel format=commax10.2 ; 

    VAR &&ILE;

    CLASS &&zmienna/ MISSING;
    CLASS &&cel/ MISSING;

    TABLE 

    /* Row Dimension */
&&cel,
/* Column Dimension */
&&ILE*  ColPctSum*    &&zmienna*[style=[background=temp.]];

RUN;
%mend tabelka1; 

data makro_2;
set makro;
if x=1 then call execute ('%tabelka1');
run;
%macro tabelka1;
proc format;
value temp 70- HIGH='red';
run;

PROC TABULATE DATA=Stat_for_&cel format=commax10.2 ; 
  VAR &ILE;
  CLASS &zmienna/ MISSING;
  CLASS &cel/ MISSING;
  TABLE &cel,&ILE*ColPctSum*&zmienna*[style=[background=temp.]];
RUN;
%mend tabelka1;
然后,要有条件地调用宏,可以使用数据步骤

data _null_;
  set makro;
  if x=1;
  call execute('%nrstr(%tabelka1);');
  stop;
run;

不幸的是,您的问题不够清楚,无法理解您到底在寻求什么帮助。示例输入和输出数据会有所帮助。如果MAKRO中有多个观测值满足条件X=1,是否要多次运行宏?或者,如果任何观测值的X=1,是否只运行一次?或者,只有当所有观测值都为X=1时,才可以这样做?下面是一个如何编写宏的示例。在代码的底部有执行宏的示例代码。注意注释和用法中的参数列表。