↑こんな感じです。新しいツールバーを作るところまでは一緒です。コンボ ボックスを配置するコードは、
Sub AddComboBox() ''ツールバー[検索ツールバー]にコンボ ボックスを作る With CommandBars("検索ツールバー").Controls.Add(Type:=msoControlComboBox) .Caption = "ComboBox" .OnAction = "SheetSearch" End With End Sub
となります。引数 Type に指定する定数が違うところに留意してください。
配置したコンボ ボックスは、UserForm 上で利用できるコンボ ボックスと同じように扱えます。データを追加するときは、
Sub AddDate() Dim i As Long For i = 1 To 10 CommandBars("検索ツールバー").Controls("ComboBox").AddItem "データ " & i Next i CommandBars("検索ツールバー").Controls("ComboBox").ListIndex = 3 End Sub
のようにします。ListIndex を設定することもできます。
コンボ ボックスのテキスト入力部で Enter キーを押したときと、リスト ボックス部でデータを選択したときに、OnAction プロパティに登録したプロシージャが実行されます。テキスト部に入力された文字列は Text プロパティで、リスト ボックス部で選択したデータはList(ListIndex) で取得できます。要するに、UserForm 上で使うコンボ ボックスと同じです。
ここではサンプルとして、テキスト部に入力したデータもしくはリスト部で選択したデータをアクティブシートで検索するプロシージャを紹介します。新しく検索したデータはリスト部の先頭に追加されます。
Sub SheetSearch() ''検索するプロシージャ Dim FoundCell As Variant Set FoundCell = Cells.Find(What:=CommandBars("検索ツールバー").Controls("ComboBox").Text) If Not FoundCell Is Nothing Then FoundCell.Activate Call AddDate End Sub Sub AddDate() ''履歴を登録するプロシージャ Dim i As Long With CommandBars("検索ツールバー").Controls("ComboBox") ''登録データ1件もがなかったら、登録しておしまい If .ListCount = 0 Then .AddItem .Text Exit Sub End If ''既存リストに新規データがあったら... For i = 1 To .ListCount If .Text = .List(i) Then .RemoveItem (i) .AddItem .Text, 1 Exit Sub End If Next i ''既存リストに新規データがなかったら... .AddItem .Text, 1 End With End Sub