VBA更改表格代号运行时错误9:下标超出范围

Fu1*_*13R 9 vba runtime-error rename worksheet excel-vba

我有一些代码,当我按下一个按钮时,它调用一个sub,它将向工作簿添加一个新工作表,然后更改工作表的代号,以便以后在我的代码中更容易引用.具体如下:

Dim wbk As Workbook
Dim wks As Worksheet

Set wbk = ThisWorkbook

wbk.Sheets.Add.Name = "Admin - Save Log"
Set wks = wbk.Worksheets("Admin - Save Log")
wks.Parent.VBProject.VBComponents(wks.CodeName).Name = "wksAdminSaveLog"
Run Code Online (Sandbox Code Playgroud)

这似乎工作 - 但是 - 只有当我打开"开发人员"窗口或之前打开它时.

如果我在第一次打开Excel文档时单击该按钮(尚未打开"开发人员"窗口),则会添加工作表,但会出现以下错误,并且不会更改工作表的代号:

运行时错误'9':下标超出范围

只有当我按下Debug然后在"Developer"窗口再次打开后运行代码时才会添加代号.

有没有办法解决这个问题,以便用户不必打开开发人员窗口才能正常运行?

谢谢

Thu*_*ame 6

@Comintern已经为您提供了一个有效的解决方案,但是此代码不会污染您的立即窗口,并使用隐藏_CodeName属性来更改工作表名称而不是访问该vbComponents集合.

它还使用早期绑定Worksheet赋值wks,然后使用With块,因为它正在访问多个成员wks.

有趣的是,VBProject成员使用的位置很重要.

Dim wbk As Workbook
Dim wks As Worksheet

Set wbk = ThisWorkbook
Set wks = wbk.Worksheets.Add

'Oddly, this statement MUST appear AFTER the Worksheets.add
Debug.Assert wbk.VBProject.Name <> vbNullString 'Don't pollute the Immediate window

With wks
  .Name = "Admin - Save Log"
  .[_CodeName] = "wksAdminSaveLog"
End With
Run Code Online (Sandbox Code Playgroud)


Com*_*ern 5

如果您需要打开 VBE,您可以“欺骗”调试上下文来为您执行此操作。VBE.MainWindow这似乎可以通过强制存在来执行项目需要更新其索引的任何操作:

Dim wbk As Workbook
Dim wks As Worksheet

Set wbk = ThisWorkbook

Set wks = wbk.Sheets.Add
wks.Name = "Admin - Save Log"
Debug.Print wbk.VBProject.VBE.MainWindow.Caption   '<--Force the VBE to exist.
wbk.VBProject.VBComponents(wks.CodeName).Name = "wksAdminSaveLog"
Run Code Online (Sandbox Code Playgroud)

编辑:

似乎简单地获取对 的引用VBE.MainWindow就足够了(请参阅评论)。这也有效:

Dim editor As Object
Set editor = wbk.VBProject.VBE.MainWindow   '<--Force the VBE to exist.
Run Code Online (Sandbox Code Playgroud)