我正在VBA(Excel 2016 32bit + Windows 10 Pro)中制作一个宏,当以下情况发生时,该宏就会启动 Workbook.NewSheet 事件发生时,此宏必须重命名 Sheet.CodeName 属性的每个新工作表。
问题是,当我在break模式下一步一步地运行我的Macro时,它工作得很完美。Sheet.CodeName 在VB Editor (VBE)关闭后的属性。只需 Sheet.CodeName 属性为空,所以 Macro 不知道必须重命名哪个工作表。如果我打开VBE,然后什么都不做,再关闭它,Macro就能正常运行。接下来,这个Macro可以在 Workbook.Open 和 工作簿.SheetChange 事件。只有 Workbook.NewSheet 事件给出了一个麻烦。
如果你知道的话,请给我一个建议,我怎样才能在封闭的VBE后面改进从Excel到我的Macro的参数传输。
你好!谢谢你想帮助我!这段代码非常简单,目标是将Excel中的参数传送到我的Macro中。
谢谢你想帮助我!这段代码非常简单,目标是--当VBE关闭时,在消息窗口中获取sh_CodeName属性的正确值。
目前的代码。
Private Sub Workbook_NewSheet(ByVal sh As Object)
NewSheet sh
End Sub
Option Explicit
Sub NewSheet(ByVal sh As Object)
Dim sh_CodeName As String, sh_Name As String, i As Integer
sh_CodeName = sh.CodeName: sh_Name = sh.Name
MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name, vbOKOnly, "MESSAGE FROM WorkBook.NewSheet"
End Sub
似乎 sh.codename
在添加新的工作表后,只要没有访问VBA项目,就无法使用。也许有人对此有更多的了解。
这段代码对我来说是可行的,但有一个缺点,就是你需要 对VBA项目对象模型的信任访问.
Sub NewSheet(ByVal Sh As Object)
Dim sh_CodeName As String, sh_Name As String, i As Integer
sh_CodeName = ActiveWorkbook.VBProject.VBComponents(Sh.Name).Properties("_Codename")
sh_Name = Sh.Name
MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name, vbOKOnly, "MESSAGE FROM WorkBook.NewSheet"
End Sub
即使是这个简单的宏,在封闭的VBE下运行时,也不会给出一个代号。
Sub TestAddIt()
Dim sh As Worksheet
Set sh = ActiveWorkbook.Worksheets.Add
MsgBox sh.Name & " - " & sh.CodeName
End Sub
PS: 另一个变通办法是打开VBE,然后再关闭,但您仍然需要访问VBA项目。
Sub TestAddIt()
Dim Sh As Worksheet
Set Sh = ActiveWorkbook.Worksheets.Add
With Application.VBE.MainWindow
.WindowState = 1
.Visible = True
.Visible = False
End With
MsgBox Sh.Name & " - " & Sh.CodeName
End Sub
更新: 这对我也是有效的。
Sub TestAddIt()
Dim Sh As Worksheet
Set Sh = ActiveWorkbook.Worksheets.Add
' Recompile the project
Application.VBE.CommandBars.FindControl(ID:=578).Execute
MsgBox Sh.Name & " - " & Sh.CodeName
End Sub
你帮我看看这句话。
sh_CodeName = ActiveWorkbook.VBProject.VBComponents(Sh.Name).Properties("_Codename")
我稍微修改了一下(用Sh.CodeName代替Sh.Name)。并加了一个延迟。
Sub Check_NewSheet(ByVal sh As Object)
Dim sh_CodeName As String, sh_Name As String, i As Integer
On Error Resume Next
sh_CodeName = ThisWorkbook.VBProject.VBComponents(sh.CodeName).Properties("_Codename")
If Err.number > 0 Then
i = 0
Do While sh_CodeName = ""
sh_CodeName = ThisWorkbook.VBProject.VBComponents(sh.CodeName).Properties("_Codename")
DoEvents
i = i + 1
Loop
End If
sh_Name = sh.Name
MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name & vbCrLf & _
"Attempts - " & i, vbOKOnly, "MESSAGE FROM WorkBook.NewSheet"
End Sub
现在工作得很好。作为一个临时解决方案,它是相当不错的。但是,我仍然有兴趣找出一个解释,什么是在Excel到Macro通信的问题。所以,如果你会发现一个,请与我分享。