我正在为 Excel 2003 编写一个小型 VBA 加载项,其想法是加载项在目录中查找任何“.xlt”文件,并为找到的每个文件添加一个按钮到“模板”菜单,该菜单提供快速获取空白模板的方法。大多数加载项都运行良好,但我遇到了一点问题,我很难理解为什么它不工作。
这是构建菜单的代码示例。
Public Sub BuildMenu()
Dim Active_Menu_Bar As Office.CommandBar
Dim Tmplts_MenuItem As Office.CommandBarControl
Dim Tmplts_MenuControl As Office.CommandBarControl
Dim objSearch
Dim TemplatesPath As String
DeleteControls
Application.Interactive = False
Set Active_Menu_Bar = Application.CommandBars.Item(1)
Set Tmplts_MenuItem = Active_Menu_Bar.Controls.Add(msoControlPopup, , , 10, True)
With Tmplts_MenuItem
.Caption = "Templates"
.BeginGroup = False
.Tag = C_TAG
End With
TemplatesPath = FetchValue("TemplatesPath")
Set objSearch = Application.FileSearch
objSearch.LookIn = TemplatesPath
objSearch.SearchSubFolders = False
objSearch.Filename = "*.xlt"
objSearch.Execute
For Each strFile In objSearch.FoundFiles
'Remove Path from strFile
strFile = Replace(strFile, TemplatesPath, "")
Select Case strFile
Case "Journal.xlt"
Set Tmplts_MenuControl = Tmplts_MenuItem.Controls.Add(Type:=msoControlButton, temporary:=True)
With Tmplts_MenuControl
.Caption = "New Journal"
.OnAction = "'" & ThisWorkbook.Name & "'!NewJournal"
.Tag = C_TAG
End With
Case "Budget Journal.xlt"
Set Tmplts_MenuControl = Tmplts_MenuItem.Controls.Add(Type:=msoControlButton, temporary:=True)
With Tmplts_MenuControl
.Caption = "New Budget Journal"
.OnAction = "'" & ThisWorkbook.Name & "'!NewBudgetJournal"
.Tag = C_TAG
End With
Case Else
Set Tmplts_MenuControl = Tmplts_MenuItem.Controls.Add(Type:=msoControlButton, temporary:=True)
With Tmplts_MenuControl
.Caption = "New " & strFile
.OnAction = "'" & ThisWorkbook.Name & "'!NewGenericTemplate(""" & TemplatesPath & strFile & """)"
.Tag = C_TAG
End With
End Select
Next
Set objSearch = Nothing
Set Tmplts_MenuControl = Tmplts_MenuItem.Controls.Add(Type:=msoControlButton, temporary:=True)
With Tmplts_MenuControl
.Caption = "User Preferences"
.OnAction = "'" & ThisWorkbook.Name & "'!UserPrefs"
.BeginGroup = True
.Tag = C_TAG
End With
Application.Interactive = True
End Sub
如您所见,有一个 select case 语句说,对于特定的“已知”模板,为按钮分配一个宏,以便处理该模板的要求(例如,Journal 模板的宏也填充了几个字段始终具有特定值的模板,例如由application.username
) 填充的用户名,该位按预期工作。
问题在于 Case Else。我希望能够选择恰好在目录中的任何其他模板并将完整路径传递给“通用”宏,该宏将根据模板创建一个新工作簿,而无需任何花哨的附加功能,因此在OnAction
部分MenuControl
我正在传递模板的完整路径。
但是,当我单击菜单控件时,什么也没有发生,没有错误消息,什么都没有。
这是NewGenericTemplate
宏的代码。
Sub NewGenericTemplate(MyTemplate As String)
Workbooks.Add Template:=MyTemplate
MsgBox MyTemplate
End Sub
简单的东西(意思是我可能忘记了一些非常明显的东西),msgbox
当我意识到菜单按钮不起作用并且我想检查该值是否实际上被传递时,我添加了,所以现在我得到了 msgbox 而不是什么都没有(由于某种原因两次),它显示了模板的正确路径,但没有添加工作簿。
任何帮助,将不胜感激。
PS我也尝试在NewGenericTemplate
宏中设置断点,但代码没有中断