use*_*452 6 excel vba excel-vba
有人可以帮我这个代码,我得到一个超出范围错误的下标:

"创建工作表"之后的行在调试器中以黄色突出显示
'Validation of year
If TextBox_Year.Value = Format(TextBox_Year.Value, "0000") Then
'Creating Process
'Creation of new sheet
Workbooks.Add
ActiveWorkbook.SaveAs FileName:= _
"" & Workbooks("Temperature Charts Sheet Creator").Sheets("MENU").Cells(4, 12).Value & "Data Sheet - " & ComboBox_Month.Value & " " & TextBox_Year.Value & ".xls", FileFormat _
:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _
False, CreateBackup:=False
'Creating of the sheets
Windows("Data Sheet - " & ComboBox_Month.Value & " " & TextBox_Year.Value & ".xls").Activate
Sheets("Sheet3").Select
Sheets("Sheet3").Name = "31 " & ComboBox_Month.Value
Sheets("Sheet2").Select
Sheets("Sheet2").Name = "30 " & ComboBox_Month.Value
Sheets("Sheet1").Select
Sheets("Sheet1").Name = "29 " & ComboBox_Month.Value
For i = 28 To 1 Step -1
Sheets.Add
ActiveSheet.Name = i & " " & ComboBox_Month.Value
Next
Run Code Online (Sandbox Code Playgroud)
Eri*_*idt 14
建议以下简化:从后续捕获返回值Workbooks.Add而不是下标Windows(),如下所示:
Set wkb = Workbooks.Add
wkb.SaveAs ...
wkb.Activate ' instead of Windows(expression).Activate
Run Code Online (Sandbox Code Playgroud)
一般哲学建议:
避免使用Excel的内置函数:ActiveWorkbook,ActiveSheet和Selection:捕获返回值,并且更喜欢合格的表达式.
仅使用内置插件一次,仅在最外面的宏(子)中使用,并在宏启动时捕获,例如
Set wkb = ActiveWorkbook
Set wks = ActiveSheet
Set sel = Selection
Run Code Online (Sandbox Code Playgroud)
在宏期间和宏内部不依赖于这些内置名称,而是捕获返回值,例如
Set wkb = Workbooks.Add 'instead of Workbooks.Add without return value capture
wkb.Activate 'instead of Activeworkbook.Activate
Run Code Online (Sandbox Code Playgroud)
此外,尝试使用合格的表达式,例如
wkb.Sheets("Sheet3").Name = "foo" ' instead of Sheets("Sheet3").Name = "foo"
Run Code Online (Sandbox Code Playgroud)
要么
Set newWks = wkb.Sheets.Add
newWks.Name = "bar" 'instead of ActiveSheet.Name = "bar"
Run Code Online (Sandbox Code Playgroud)
使用合格的表达式,例如
newWks.Name = "bar" 'instead of `xyz.Select` followed by Selection.Name = "bar"
Run Code Online (Sandbox Code Playgroud)
这些方法通常可以更好地工作,提供更少的混乱结果,在重构时更加健壮(例如,在方法内部和方法之间移动代码行),并且在Excel版本中可以更好地工作.例如,选择在从一个版本的Excel到另一个版本的宏执行期间会有所不同.
另请注意,.Activate在使用更合格的表达式时,您可能会发现几乎不需要这么多.(这可能意味着对于用户而言屏幕将更少闪烁.)因此Windows(expression).Activate可以简单地消除整条线而不是被替换wkb.Activate.
(另请注意:我认为您显示的.Select语句没有贡献,可以省略.)
(我认为Excel的宏录制器负责使用ActiveSheet,ActiveWorkbook,Selection和Select这么多来推广这种更脆弱的编程风格;这种风格留下了很大的改进空间.)
当您尝试引用无效集合的索引时,会发生下标超出范围错误。
最有可能的是,Windows 中的索引实际上并不包含 .xls。窗口的索引应与 Excel 标题栏中显示的工作簿名称相同。
作为猜测,我会尝试使用这个:
Windows("Data Sheet - " & ComboBox_Month.Value & " " & TextBox_Year.Value).Activate
Run Code Online (Sandbox Code Playgroud)