工作表什么时候分配他们的.CodeName属性?

所以,在我的VBA的过程中,我在工作簿中创build了一个子表,并dynamic地将代码添加到新的表激活事件中。 实际上很酷。 但是,我遇到了表单代码名称的问题,当我去引用新表单时,新表单没有被分配代码名称。

用于获取对新表单代码模块的引用的代码是: With ActiveWorkbook.VBProject.VBComponents(CName).CodeModule .CodeModule其中CName是表单代码名称。

我得到CName: CName = Workbooks(ExcelFormName).Sheets(NewSheetName).CodeName其中NewSheetName是一个全局常量。 这总是起作用的,因为这个代码的执行与创build表单的function相同,因此用户没有机会重命名表单。

我发现通过testing(包括头发拉动),当我创build工作表: Set ws = Sheets.Add(, After:=Sheets(Worksheets.count))表没有分配代码的名称,除非vbe窗口打开..我使用了debug.print "Test " & ws.codename来确认代号是空的 – ""所以当我试图用代码名称引用表时,我得到一个错误。 我发现我能做的是:

 Application.VBE.MainWindow.Visible = True Application.VBE.MainWindow.WindowState = vbext_ws_Minimize 

在创build工作表之前,要快速打开并最小化VBE窗口(我稍后closures它),这是我不喜欢的,但它工作。 但是现在我遇到了一些问题,有些用户的安全设置不允许vbe窗口打开。

我注意到,就在现在,如果我循环遍历工作簿中的所有vbcomponents,甚至不做任何处理,如:

 Dim test As VBComponent For Each test In ActiveWorkbook.VBProject.VBComponents Next 

然后在工作表中有一个代码名称..所以我想知道,除了循环通过这样的组件,以确保新的工作表有一个代码名称,而不是这样做,工作表何时正常如果VBE窗口未打开,请指定其代码名称?

编辑

你的build议siddharth结果的图片:

在这里输入图像说明

你可以看到,我添加了你的build议,我得到了错误9,下标超出范围的错误

EDIT2

 Dim CName As Variant CName = Workbooks(ExcelFormName).Sheets(NewSheetName).CodeName With ActiveWorkbook.VBProject.VBComponents(CName).CodeModule StartLine = .CreateEventProc("Activate", "worksheet") + 1 .InsertLines StartLine, "Dim numRows As Long" .InsertLines StartLine + 1, "Dim numColumns as long" .InsertLines StartLine + 2, "numRows = 0" .InsertLines StartLine + 3, "numColumns = 0" 'mode codez 

我正在dynamic地将代码添加到新的工作表激活事件。 我通常会添加它,但是当用户closures这本书的时候,这张表会被删除。 这个特殊的表单不是一直需要的,所以我不想要它,除非特定的用户需要它:)

是的,这是一个非常古老的问题。 要访问代号,使用这个

 Dim ws As Worksheet Set ws = Sheets.Add(, After:=Sheets(Worksheets.count)) Msgbox ThisWorkbook.VBProject.VBComponents(ws.Name).Properties("Codename") 

但是,要使此代码正常工作,必须检查Trust access to the VBA-Project Object model

在这里输入图像说明

总结任何人阅读,创build工作表后:

 Dim ws As Worksheet Set ws = Sheets.Add(, After:=Sheets(Worksheets.count)) 

使用: ws.name = ThisWorkbook.VBProject.VBComponents(ws.Name).Properties("Codename")

它不应该改变工作表的名字,因为在重新命名一个新工作表的时候,名字和代码名是一样的,但是它会强制应用程序指定代码名,而不是等到所有代码运行完毕。

如果没有先使用ThisWorkbook.VBProject.VBComponents(ws.Name).Properties("Codename")执行某些类似msgbox ws.codename代码,那么ws.codename将为空