1

私は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が、コードが壊れません

4

2 に答える 2

0

わかった。このスレッドからの提案を変更することができました。

.Parameter新しいコントロールで、次のように追加します。

With Tmplts_MenuControl
   .OnAction = "'" & ThisWorkbook.Name & "'!NewGenericTemplate"
  .Parameter = "'" & ThisWorkbook.FullName & "'!NewGenericTemplate"
  .Caption = "New Generic Template"
  .FaceId = 99
  .Style = msoButtonCaption
  .BeginGroup = True
End With

次に、NewGenericTemplateこれを受け取るようにサブルーチンを変更します.Parameter。すこし。コントロールをインデックスで参照できないため、動的に見えるため、既存のコントロール/サブコントロールをループして、コントロールの値にmyTemplate基づいて割り当てます。.OnAction

Sub NewGenericTemplate()
Dim varControls As Variant 'top level controls
Dim ctrl As Variant 'secondary controls within top-level
Dim myTemplate As String

'Since I can't refernce the controls by Index (they are dynamic), we loop over them:
For Each varControls In Application.CommandBars("Command Bar Name").Controls '<--- EDIT AS NECESSARY
    For Each ctrl In varControls.Controls
        If ctrl.OnAction = "'" & ThisWorkbook.FullName & "'!NewGenericTemplate" Then
            myTemplate = ctrl.Parameter
            GoTo EarlyExit:
        End If
    Next
Next

Exit Sub 'if no parameter has been assigned.

EarlyExit:
If Not myTemplate = vbNullString Then
    Workbooks.Add Template:=myTemplate
End If

End Sub

これは私にとってはうまく機能しており、以前の試みはあなたが経験していたのと同じ問題で失敗しました。

于 2013-03-25T21:40:27.157 に答える
0

残念ながら、私はこの質問を数週間脇に置いておく必要がありましたが、今日私はそれに戻り、基本に戻って、メニューボタンからマクロに変数を渡す方法を探すことにしました。このスレッドに私。

私が今やったことは、.OnActionプロパティをから変更することです

.OnAction = "'" & ThisWorkbook.Name & "'!NewGenericTemplate(""" & TemplatesPath & strFile & """)"

.OnAction = "'NewGenericTemplate """ & strFile & """'"

したがって、基本的に、マクロを含むファイルへの参照を削除します。また、フルパスではなくファイル名のみを渡すので、以下はNewGenericTemplateルーチンに使用しているコードです。

Public Sub NewGenericTemplate(MyTemplate As String)

Dim TemplatesPath As String
Dim FullPathToTemplate As String

'Retrieve path to Templates Directory
TemplatesPath = FetchValue("TemplatesPath")

FullPathToTemplate = TemplatesPath & MyTemplate

If Dir(FullPathToTemplate) <> "" Then
    Workbooks.Add FullPathToTemplate
    Else
    MsgBox "Template File not Found, it may have been moved or deleted.", vbExclamation, "File Not Found"
End If

End sub

うまくいけば、それはソートされるべきです。

于 2013-04-18T11:16:29.457 に答える