UserFormでツールバーを使う


UserFormでツールバーを使う方法です。外部コントロール(MSComctlLib)を使いますので、お使いのパソコンにインストールされていない環境では使用できませんが、よほど特殊だったり、古い環境でなければ使用できるはずです。ちなみに、。MSComctlLibのファイル名はC:\WINDOWS\System32\MSCOMCTL.OCXです。

まずは、UserFormでツールバーを使えるようにする準備から。

  1. VBEで[ツールボックス]を右クリックして、[その他のコントロール]をクリックします
  2. 「Microsoft ImageList Control 6.0(SP4)」をオンにします
  3. 「Microsoft Toolbar Control 6.0(SP4)」をオンにして、[OK]ボタンをクリックします

ツールバーは「Microsoft Toolbar Control 6.0(SP4)」です。「Microsoft ImageList Control 6.0(SP4)」は、ツールバーに表示するイメージを管理するイメージリストです。「6.0」や「SP4」は、いわばファイルのバージョンのようなものです。お使いの環境では違うかもしれません。まぁ、試しに登録してみて、使えるかどうかやってみるのが一番です。正常に組み込まれると、次のようなアイコンが2つ登録されます。

   

次に、イメージリストをUserForm上に配置します。ここでは、次の画像を登録します。

画像 ファイル名 登録する名前
open.bmp OpenFile
new.bmp NewFile
save.bmp SaveFile

登録できる画像はbmp形式などです。サイズに注意して、ご自分で作成するか、既存のツールバーをキャプチャして使いましょう。ただし、ツールバーのボタン画像にも著作権が発生します。自分だけで使うUserFormなら問題ないですが、第三者に配布するときや販売するときなどには、著作権に十分留意してください。

上図はImaeListを配置したところです。実行時には表示されないコントロールですから、配置する場所はどこでもけっこうです。

ImageListを選択すると、[プロパティ]ウィンドウに[(プロパティページ)]という項目が表示されます。

ここの右端にある[...]ボタンをクリックすると、[プロパティページ]ダイアログボックスが表示されます。

[イメージ]タブを開き、[ピクチャの挿入]ボタンをクリックします。

[図の選択]ダイアログボックスで「open.bmp」を選択して[開く]ボタンをクリックします。

実行すると、[プロパティページ]ダイアログボックスに「open.bmp」が登録されます。

[キー]ボックスに「OpenFile」と入力して[適用]ボタンをクリックします。

同じ手順で、「new.bmp」を挿入して「NewFile」という名前をつけます。さらに、「save.bmp」を挿入して「SaveFile」という名前をつけます。

これで画像の準備は完了です。

さあ、いよいよツールバーの配置です。

ツールバーも、イメージリストと同じように[プロパティページ]ダイアログボックスが使えます。[プロパティページ]ダイアログボックスでボタンを挿入することも可能ですが、ここではマクロのコードで追加する方法を解説します。

FormのInitializeイベントで、ツールバーの初期化をします。

Private Sub UserForm_Initialize()
    With Toolbar1
        ''イメージリストの関連づけ
        .ImageList = ImageList1
        ''位置と幅を調整
        .Top = 0
        .Left = 0
        .Width = Width
        ''ボタンを3つ配置する
        .Buttons.Add , "Key" & .Buttons.Count, "", 0, "OpenFile"
        .Buttons.Add , "Key" & .Buttons.Count, "", 0, "NewFile"
        .Buttons.Add , "Key" & .Buttons.Count, "", 0, "SaveFile"
    End With
End Sub

ほら!なんか、それっぽくなってきたでしょ(^_^)

ツールバーのボタンは、Buttonsコレクションで管理します。追加するときはAddメソッドです。引数は次の通り。

Buttons.Add Index, Key, Caption, Style, Image

Indexはボタンを識別するインデックス値です。クリックされたときの処理で参照しますが、追加時には省略可能です。

Keyはボタンを識別する重複しないキー(名称)です。上記のサンプルでは、「Key1」「Key2」のように、「Key」+ボタンの数 を指定しています。

Captionは、ボタン表面に表示する文字列です。

Styleには、次の数値を指定します。

数値 Style
0 標準的なボタン
1 チェックボタン
2 ボタングループ
3 セパレータ
4 プレースフォルダ
5 ドロップダウンボタン

この中で一般的なのは、「0:標準的なボタン」と「3:セパレータ」それに「5:ドロップダウンボタン」でしょう。「1:チェックボタン」や「2:ボタングループ」というのは、要するにチェックボックスやオプションボタンみたいなもんです。

「3:セパレータ」を指定すると、ボタンとボタンの間に少し空白が入ります。

「5:ドロップダウンボタン」は、右に▼が表示されるボタンです。Excelのツールバーでいうと、[フォントの色]ボタンや[罫線]ボタンみたいな外観です。ただし、クリックして表示できるのは、文字列のメニューです。そのメニューは、ButtonMenusコレクションとして追加します。

Private Sub UserForm_Initialize()
    With Toolbar1
        ''イメージリストの関連づけ
        .ImageList = ImageList1
        ''位置と幅を調整
        .Top = 0
        .Left = 0
        .Width = Width
        ''ボタンを3つ配置する
        .Buttons.Add , "Key" & .Buttons.Count, "", 0, "OpenFile"        ''1つめのボタン
        .Buttons.Add , "Key" & .Buttons.Count, "", 3                    ''セパレータ
        .Buttons.Add , "Key" & .Buttons.Count, "", 0, "SaveFile"        ''2つめのボタン
        With .Buttons.Add(, "Key" & .Buttons.Count, "", 5, "NewFile")   ''3つめのボタン
            .ButtonMenus.Add , "menu1", "テキストファイル"
            .ButtonMenus.Add , "menu2", "CSVファイル"
            .ButtonMenus.Add , "menu3", "Excelブック"
            .TooltipText = "新しいファイル"
        End With
    End With
End Sub

なお、ボタンにマウスを合わせたときに表示されるポップアップテキストは、ButtonオブジェクトのTooltipTextプロパティに指定します。たとえば上記のコードでは、3つめのボタンに設定しています。実行すると次のようになります。

ここまでは、ボタンを配置する処理でした。ボタンがクリックされたときに実行する処理は、ToolbarのButtonClickイベントに記述します。クリックされたボタンは、ButtonClickプロシージャの引数Buttonに格納されます。

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
    MsgBox Button.Index & "番目のボタンがクリックされました"
End Sub

ボタンのインデックス値(Index)で注意しなければならないのは、セパレータも1つのボタンと認識されることです。

あるいは、Keyプロパティを使って、

Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
    MsgBox Button.Key & "がクリックされました"
End Sub

ドロップダウンボタンのメニューがクリックされると、ButtonMenuClickイベントが発生します。考え方は同じです。

Private Sub Toolbar1_ButtonMenuClick(ByVal ButtonMenu As MSComctlLib.ButtonMenu)
    MsgBox ButtonMenu.Index & "番目の" & vbCrLf & _
           ButtonMenu.Text & "がクリックされました。ボタンの名前は" & vbCrLf & _
           ButtonMenu.Parent.Key & "です。"
End Sub

ちと長くなりましたので、このへんにしておきます。あとは、発想と工夫しだいということです(^_^)