Sas 在一系列年份中执行宏

Sas 在一系列年份中执行宏,sas,sas-macro,do-loops,Sas,Sas Macro,Do Loops,我已经为这个问题挣扎了一段时间了。我已经编写了一个宏,我们称之为macro1,我想在一个年份列表上运行它,比如说1989 1990 1995,使用do或%do在开放代码中循环,但我无法让它工作。我一直在尝试按照 %let years = 1989 1990 1995 %local i next_year %do i=1 %to %sysfunc(%countw(&years)); next_year = %scan(&years, &i); %macro1

我已经为这个问题挣扎了一段时间了。我已经编写了一个宏,我们称之为
macro1
,我想在一个年份列表上运行它,比如说
1989 1990 1995
,使用
do
%do
开放代码中循环,但我无法让它工作。我一直在尝试按照

%let years = 1989 1990 1995
%local i next_year
%do i=1 %to %sysfunc(%countw(&years));
    next_year = %scan(&years, &i);
    %macro1(&next_year);
%end

无济于事。有没有人能方便地解决这个问题?这似乎是另一种编程语言可以在3行代码中完成的事情(尽管我必须使用SAS作为唯一可用的语言)。任何帮助都会很好

如果包含创建宏变量所需的
%LET
,则代码可以在宏定义内工作。并用所需的分号终止您的声明。同时也省去了你不需要的分号

%macro test(years);
%local i next_year;
%do i=1 %to %sysfunc(%countw(&years));
  %let next_year = %scan(&years, &i);
  %macro1(&next_year)
%end;
%mend test;
%test(1989 1990 1995)
您还可以完全消除不必要的下一年变量

%macro1(%scan(&years, &i))
实际上,您应该避免使用宏编码。首先,坚持学习如何编写实际的SAS代码。等待了解如何使用宏生成代码,直到您知道要生成的代码。使用数据步骤的实际语言创建复杂的DO循环比尝试在宏处理器中编写代码要容易得多

data _null_;
  do year=1989, 1990, 1995 ;
    call execute(cats('%nrstr(%macro1)(',year,')'));
  end;
run;
但有时,墙纸代码比过于复杂的事情更容易。这是三行程序

%macro1(1989)
%macro1(1990)
%macro1(1995)

如果包含创建宏变量所需的
%LET
,则代码可以在宏定义内工作。并用所需的分号终止您的声明。同时也省去了你不需要的分号

%macro test(years);
%local i next_year;
%do i=1 %to %sysfunc(%countw(&years));
  %let next_year = %scan(&years, &i);
  %macro1(&next_year)
%end;
%mend test;
%test(1989 1990 1995)
您还可以完全消除不必要的下一年变量

%macro1(%scan(&years, &i))
实际上,您应该避免使用宏编码。首先,坚持学习如何编写实际的SAS代码。等待了解如何使用宏生成代码,直到您知道要生成的代码。使用数据步骤的实际语言创建复杂的DO循环比尝试在宏处理器中编写代码要容易得多

data _null_;
  do year=1989, 1990, 1995 ;
    call execute(cats('%nrstr(%macro1)(',year,')'));
  end;
run;
但有时,墙纸代码比过于复杂的事情更容易。这是三行程序

%macro1(1989)
%macro1(1990)
%macro1(1995)

为什么?三次调用宏会不会更短?为什么要打开代码?您不能在开放代码中这样做,但您可以在
data\u null\u
步骤中使用call
execute()
DOSUBL()
。您好,实际上不需要开放代码。而且,这就像20年,所以我不想执行20次。为什么?三次调用宏会不会更短?为什么要打开代码?您不能在开放代码中这样做,但您可以在
data\u null\u
步骤中使用call
execute()
DOSUBL()
。您好,实际上不需要开放代码。另外,这就像是20年,所以我不想执行20次。如果我的
%macro1
本身有一个数据步骤,可以吗?我可以在数据步骤中调用数据步骤吗?所有这些方法都可以与生成多个步骤的宏一起使用
CALL EXECUTE()
将当前数据步骤完成后要运行的命令堆叠起来。如果我的
%macro1
本身有一个数据步骤,可以吗?我可以在数据步骤中调用数据步骤吗?所有这些方法都可以与生成多个步骤的宏一起使用<代码>调用执行()将当前数据步骤完成后要运行的命令堆叠起来。