VBA下标超出范围 - 错误9

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这么多来推广这种更脆弱的编程风格;这种风格留下了很大的改进空间.)


Dan*_*iel 3

当您尝试引用无效集合的索引时,会发生下标超出范围错误。

最有可能的是,Windows 中的索引实际上并不包含 .xls。窗口的索引应与 Excel 标题栏中显示的工作簿名称相同。

作为猜测,我会尝试使用这个:

Windows("Data Sheet - " & ComboBox_Month.Value & " " & TextBox_Year.Value).Activate
Run Code Online (Sandbox Code Playgroud)