建议进行以下简化:捕获返回值Workbooks.Add
而不是下标Windows()
之后,如下:
Set wkb = Workbooks.Add
wkb.SaveAs ...
wkb.Activate ' instead of Windows(expression).Activate
一般哲学建议:
避免使用 Excel 的内置函数:ActiveWorkbook、ActiveSheet 和 Selection:捕获返回值,并倾向于使用限定表达式。
仅在最外层宏(子)中使用内置函数一次,并在宏开始时捕获,例如
Set wkb = ActiveWorkbook
Set wks = ActiveSheet
Set sel = Selection
在宏期间和内部不依赖于这些内置名称,而是捕获返回值,例如
Set wkb = Workbooks.Add 'instead of Workbooks.Add without return value capture
wkb.Activate 'instead of Activeworkbook.Activate
另外,尝试使用限定表达式,例如
wkb.Sheets("Sheet3").Name = "foo" ' instead of Sheets("Sheet3").Name = "foo"
or
Set newWks = wkb.Sheets.Add
newWks.Name = "bar" 'instead of ActiveSheet.Name = "bar"
使用限定表达式,例如
newWks.Name = "bar" 'instead of `xyz.Select` followed by Selection.Name = "bar"
这些方法通常会更好地工作,提供更少的混乱结果,在重构时会更加健壮(例如,在方法内和方法之间移动代码行),并且在 Excel 版本之间会更好地工作。例如,在宏执行过程中,从一个版本的 Excel 到另一版本的选择会发生不同的变化。
另请注意,您可能会发现您不需要.Activate
使用更多限定表达式时几乎同样如此。 (这可能意味着对于用户来说屏幕闪烁会更少。)因此整条线Windows(expression).Activate
可以简单地消除而不是被取代wkb.Activate
.
(另请注意:我认为您显示的 .Select 语句没有贡献,可以省略。)
(我认为 Excel 的宏记录器负责推广这种使用 ActiveSheet、ActiveWorkbook、Selection 和 Select 的更脆弱的编程风格;这种风格留下了很大的改进空间。)