VBA 關於CommandBar


您需要從命令欄釋放焦點以修復錯誤。嘗試將其添加到 ExecuteMso 行下方:
sld.Application.CommandBars.ReleaseFocus
除“ Button ”外,工具欄上的控件還包括“ ComboBox ”和“ PopUp ” 。
“工具欄”一詞已消失。.. .. ..   從Office 2007 開始,采用了“功能區”而不是“工具欄”。
但是,在VBA上,“工具欄(CommandBar) ”仍然存在,並且在“工具欄(CommandBar) ”上運行的常規宏工作正常。工具欄本身顯示為功能區上加載項選項卡的成員

那么,在考慮“未來”如何移動到“功能區”時,仍然存在“功能區”不適合動態操作的問題。
這里說明的是使用常規的“工具欄”,但是由於常規的“工具欄”是存儲在功能區的“加載項”選項卡中的,所以增加了對選擇這個“加載項”選項卡的支持。我是。

這是在上一頁的“ 3 個按鈕”示例中添加了ComboBoxPopUp的示例。(部分展示)
在上一頁源代碼示例的之前添加了以下主要部分。

'***************************************************************************************************
Private Sub Auto_Open()
    '-----------------------------------------------------------------------------------------------
    Dim objBar As CommandBar                                        ' CommandBar
    Dim objCont As CommandBarControl                                ' CommandBarControl
    Dim objCombo As CommandBarComboBox                              ' CommandBarComboBox
    Dim objPopUp As CommandBarPopup                                 ' CommandBarPopup
    Dim intIx As Integer                                         
    Dim intIxT As Integer                                          
    Dim intY As Integer                                            
    Dim intM As Integer                                            
    Dim blnTrue As Boolean                                        
    Dim tblYM(11) As String                                        

    intY = Year(Date)
    intM = 4
    If Month(Date) < 4 Then intY = intY - 1
    For intIx = 0 To 11
        tblYM(intIx) = CStr(intY) & "年" & Format(intM, "00") & "月"
        If intY = Year(Date) And intM = Month(Date) Then intIxT = intIx
        intM = intM + 1
        If intM > 12 Then
            intY = intY + 1
            intM = 1
        End If
    Next intIx
    '-----------------------------------------------------------------------------------------------
    ' 年月ComboBox
    Set objCont = objBar.Controls.Add(Type:=msoControlComboBox)   
    objCont.BeginGroup = True
    Set objCombo = objCont
    With objCombo                                                  
        .Style = msoComboLabel
        .Width = 120              
        .Caption = "年月"
        For intIx = 0 To 11
            .AddItem tblYM(intIx)
        Next intIx
        .ListIndex = intIxT
        .OnAction = "CBO_Click"
    End With
    '-----------------------------------------------------------------------------------------------
    ' PopUp
    Set objCont = objBar.Controls.Add(Type:=msoControlPopup)      
    objCont.BeginGroup = True
    Set objPopUp = objCont
    objPopUp.Caption = "サブメニュー"
    blnTrue = False
    For intIx = 0 To 2                                            
        Set objCont = objPopUp.Controls.Add(Type:=msoControlButton)
        objCont.BeginGroup = blnTrue
        Set objBtn = objCont
        objBtn.Style = msoButtonCaption         
        objBtn.Caption = vntCaption2(intIx)   
        objBtn.TooltipText = vntTipText(intIx)  
        objBtn.OnAction = vntOnAction(intIx)    
        blnTrue = True
    Next intIx
End Sub

①將組合添加到工具欄。只有“類型”與添加按鈕的情況不同。
②將該項目添加到組合列表中。它與UserForm ComboBox控件完全相同。
③向工具欄添加一個彈出窗口。
④在彈出窗口中添加三個按鈕。這個過程與在上一個工具欄中添加3個按鈕完全相同,只是要添加( Add)的人⑤從“objBar”變為“ objPopUp ”。

對於通過宏添加的工具欄,“加載項”選項卡將出現在功能區上,並且會像這樣顯示。
默認情況下,“加載項”選項卡處於選中狀態。

單擊按鈕或組合時執行的過程是OnAction中注冊的過程。

'***************************************************************************************************
Private Sub BTN_TOUROKU()
    MsgBox "登録"
End Sub
'***************************************************************************************************
Private Sub BTN_KOUSHIN()
    '-----------------------------------------------------------------------------------------------
    MsgBox "「更新」"
End Sub
'***************************************************************************************************
Private Sub BTN_SAKUJO()
    '-----------------------------------------------------------------------------------------------
    MsgBox "「削除」"
End Sub
'***************************************************************************************************
Private Sub CBO_Click()
    '-----------------------------------------------------------------------------------------------
    Dim xlAPP As Application                                        ' Excel.Application
    Dim objBar As CommandBar                                        ' CommandBar
    Dim objCont As CommandBarControl                                ' CommandBarControl
    Dim objCombo As CommandBarComboBox                              ' CommandBarComboBox
    Set xlAPP = Application
    Set objBar = xlAPP.CommandBars(g_cnsTitle)
    Set objCombo = objBar.Controls(4)
    MsgBox "「コンボ」"

在工具欄上注冊按鈕或組合時,這些過程中的每一個都在OnAction屬性中設置。
對於按鈕,每個按鈕調用一個單獨的過程,但對於組合,單擊列表中的任何項目都會調用相同的過程。因此,有必要確定被調用過程選擇了哪個項目。這是通過獲取組合對象工具欄上的第四個控件然后通過其選擇索引 ( ListIndex ) 或選定文本(Text)來確定的。

在此示例中,工具欄的名稱是固定的,但工具欄名稱在應用程序級別是“Alternative”。換句話說,如果您打開多個實現相同宏的工作簿,工具欄將已經存在於您稍后打開的工作簿中,從而導致運行時錯誤。
為避免這種情況,您必須動態控制工具欄的名稱。
例如,可以使用不帶擴展名的工作簿名稱,但如果使用名稱保存,之后工作簿名稱會發生​​變化,因此打開時工具欄的名稱保存在隱藏單元格中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM