Macros 在spss宏中执行IF和Compute

Macros 在spss宏中执行IF和Compute,macros,spss,Macros,Spss,我有以下spss语法: DO IF SYSMIS(V5). COMPUTE V5 = LAG(V5). END IF. EXE. 它很好用。但是我想对几个变量重复同样的过程。我试图编写一个宏来实现这一点,但我不断收到错误消息。这是我的尝试: define filldown (!positional !cmdend). do if sysmis(!1). compute !1 = lag (!1). end if. execute. !enddefine. !filldow

我有以下spss语法:

DO IF SYSMIS(V5).
 COMPUTE V5 = LAG(V5).
END IF.
EXE.
它很好用。但是我想对几个变量重复同样的过程。我试图编写一个宏来实现这一点,但我不断收到错误消息。这是我的尝试:

define filldown (!positional !cmdend).
  do if sysmis(!1).
   compute !1 = lag (!1).
  end if.
  execute.
!enddefine.

!filldown V5 age wt htm.

如何编写一个可以工作的宏(我不熟悉宏)?

宏只是一个文本替换函数。它将取代您的
!1
调用宏时提供的任何参数(
V5 age wt htm

为了保持简单,我建议使用一个简单的
do repeat
命令,而不是宏,如果您不熟悉宏,使用宏可能会有点不舒服

do repeat varlist=V5 age wt htm.
if sysmis(varlist) varlist=lag(varlist).
end repeat.
exe.

注意:如果你真的想使用你的宏,你需要分别为每个变量调用它。

@horace\u vr的
do repeat
解决方案绝对是适合这种情况的正确方法。 以下内容只是为了在使用宏时了解一些有关宏的知识

首先,可以对每个变量分别使用当前宏,但需要使用原始宏调用(不要添加“!”),因此:

当然,您可以在宏中创建循环,如下所示:

define filldown (!positional !cmdend).
!do !vr !in (!1)
  do if sysmis(!vr).
   compute !vr = lag (!vr).
  end if.
  execute.
!doend
!enddefine.
现在,您可以在完整列表中使用宏调用一次:

filldown V5 age wt htm.

我会做一次重复,但是变量不是连续的。此外,我想在分析中多次使用宏调用。
结构中指定的变量不必是连续的。如果它们是连续的,您可以像
var1到varn那样指定它们;如果它们不是连续的,您只需显式地指定它们,就像我在asnwer中所做的那样
V5
age
wt
htm
可以位于数据集中的任何位置。
filldown V5 age wt htm.