您需要從命令欄釋放焦點以修復錯誤。嘗試將其添加到 ExecuteMso 行下方:
sld.Application.CommandBars.ReleaseFocus
除“ Button ”外,工具欄上的控件還包括“ ComboBox ”和“ PopUp ” 。
“工具欄”一詞已消失。.. .. .. 從Office 2007 開始,采用了“功能區”而不是“工具欄”。
但是,在VBA上,“工具欄(CommandBar) ”仍然存在,並且在“工具欄(CommandBar) ”上運行的常規宏工作正常。工具欄本身顯示為功能區上加載項選項卡的成員。
那么,在考慮“未來”如何移動到“功能區”時,仍然存在“功能區”不適合動態操作的問題。
這里說明的是使用常規的“工具欄”,但是由於常規的“工具欄”是存儲在功能區的“加載項”選項卡中的,所以增加了對選擇這個“加載項”選項卡的支持。我是。
但是,在VBA上,“工具欄(CommandBar) ”仍然存在,並且在“工具欄(CommandBar) ”上運行的常規宏工作正常。工具欄本身顯示為功能區上加載項選項卡的成員。
那么,在考慮“未來”如何移動到“功能區”時,仍然存在“功能區”不適合動態操作的問題。
這里說明的是使用常規的“工具欄”,但是由於常規的“工具欄”是存儲在功能區的“加載項”選項卡中的,所以增加了對選擇這個“加載項”選項卡的支持。我是。
這是在上一頁的“ 3 個按鈕”示例中添加了ComboBox和PopUp的示例。(部分展示)
在上一頁源代碼示例的⑦之前添加了以下主要部分。
'*************************************************************************************************** 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”。換句話說,如果您打開多個實現相同宏的工作簿,工具欄將已經存在於您稍后打開的工作簿中,從而導致運行時錯誤。
為避免這種情況,您必須動態控制工具欄的名稱。
例如,可以使用不帶擴展名的工作簿名稱,但如果使用名稱保存,之后工作簿名稱會發生變化,因此打開時工具欄的名稱保存在隱藏單元格中。