Loops 全局宏循环冲突

Loops 全局宏循环冲突,loops,stata,stata-macros,Loops,Stata,Stata Macros,我正在尝试自动化运行一组按顺序命名的文件的过程,以相同的方式操作它们,然后保存它们 我认为在Stata中使用带有全局宏的forvalues循环是最好的方法 我的代码类似于: global s=1988 forvalues i=${s}/2018 { import excel "${s}.xlsx", sheet("Data") firstrow clear . . . save ${s}, replace } 但是,这给了我一个错误: 程序错误:代码与大括号位于同一行 似乎Stata正在读取

我正在尝试自动化运行一组按顺序命名的文件的过程,以相同的方式操作它们,然后保存它们

我认为在Stata中使用带有全局宏的
forvalues
循环是最好的方法

我的代码类似于:

global s=1988
forvalues i=${s}/2018 {
import excel "${s}.xlsx", sheet("Data") firstrow clear 
.
.
.
save ${s}, replace
}
但是,这给了我一个错误:

程序错误:代码与大括号位于同一行


似乎Stata正在读取全局宏的大括号作为循环的开始。我尝试了不同的循环变体来解决这个问题,但没有成功。由于我在循环中使用了
clear
,因此无法使用本地宏,否则它将进入无限循环。

我以前遇到过这个问题。出于某种原因,斯塔塔对花括号的数量感到困惑。如果删除它们,则
forvalues
循环将按预期工作:

global s = 1988
forvalues i = $s / 2018 {
    display `i'
}

1988
1989
1990
1991
.
.
.
2016
2017
2018
您还可以将全局宏
s
嵌套在本地宏中:

local s = ${s}
forvalues i = 1 / `s' {
    display `i'
}

没有明显的理由对1988年这样的数字使用全局宏。使用本地宏代替或只使用文字值1988。我不知道在中间循环中做什么不同,但是您正在保存到相同的数据集。因此,只有最后一次导入才会有任何效果。你可能想引用不同的电子表格文件,但并不总是指1988年的电子表格文件。