私はExcel2003用の小さな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
ご覧のとおり、特定の「既知の」テンプレートに対して、そのテンプレートの要件を処理するためにordeerのボタンにマクロを割り当てるというselect caseステートメントがあります(たとえば、Journalテンプレートのマクロは、上のいくつかのフィールドにも入力されます)によって入力されるユーザー名など、常に特定の値を持つテンプレートの場合application.username
、このビットは期待どおりに機能します。
問題はCaseElseにあります。ディレクトリにある他のテンプレートを取得して、「汎用」マクロにフルパスを渡すことができるようにしたいのですが、このマクロは、特別な追加機能なしで、テンプレートに基づいて新しいワークブックを作成するだけOnAction
です。MenuControl
テンプレートへのフルパスを渡します。
ただし、メニューコントロールをクリックしても、何も起こらず、エラーメッセージも、何も表示されません。
NewGenericTemplate
マクロのコードは次のとおりです。
Sub NewGenericTemplate(MyTemplate As String)
Workbooks.Add Template:=MyTemplate
MsgBox MyTemplate
End Sub
単純なもの(おそらく本当に明白なものを忘れていることを意味します)msgbox
、メニューボタンが機能していないことに気付いたときに追加し、値が実際に渡されていることを確認したかったので、何も表示されない代わりにmsgbox(何らかの理由で2回)、テンプレートへの正しいパスが表示されますが、ブックは追加されません。
どんな助けでもいただければ幸いです。
PSマクロにブレークポイントを設定しようとしましたNewGenericTemplate
が、コードが壊れません