【发布时间】:2017-04-22 16:23:55
【问题描述】:
我的代码在我按下按钮时会向工作簿添加一个新工作表并更改工作表的代号,以便稍后在我的代码中引用。
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"
这确实有效 - 但是 - 只有当我打开“开发者”窗口或之前已经打开它时。
如果我在第一次打开 Excel 文档(尚未打开“开发人员”窗口)时单击按钮,它会添加工作表,但是会出现以下错误并且不会更改工作表的代号:
运行时错误“9”:下标超出范围
只有当我按下调试,然后在“开发人员”窗口再次打开后运行代码时,它才会添加代号。
有什么办法可以让用户不必打开开发者窗口就可以正常运行?
【问题讨论】:
-
你应该
Set wks = wbk.Sheets.Add,然后设置它的.Name。这样您就不需要将字符串文字拼写两次。 -
您可以尝试一两个
DoEvents电话。但是,如果可以的话,使用Application.Ontime调用来运行代码以更改代号(以及发生的任何其他事情)可能会更安全。 -
澄清一下,
wks.Parent.VBProject.VBComponents(wks.CodeName)访问是否引发了运行时错误 9? -
您在当前正在执行的 VBProject 中添加和重命名 VBComponents。你很幸运,整个 IDE 和主机应用程序还没有完全崩溃——我怀疑 VBE 需要专门加载,以便涉及 P-Code 编译器或 VBA 解释器的幕后东西有机会选择启动新组件;如果 VBE 尚未加载,则您正在执行已编译的代码,其中
wks.CodeName不作为组件存在。棘手的东西。有趣的问题。 -
尽管我仍然想知道这个特定问题的答案 - 是否有理由你不能只在工作簿中使用正确的代号但将可见性设置为 @ 987654328@什么时候不需要?
标签: excel vba runtime-error rename worksheet