Microsoft Excel VBA - ワークシート選択フォームを作る方法
◆概要
ブックにシートが多数含まれている場合、シートを選択するのが困難になります。このページでは、シート選択フォームを作成し、簡単にシートを選択できるようにします。
◆ユーザーフォームの作成
まずは、ユーザーフォームを作成しましょう。
フォームに追加するコントロールは以下のとおりです。
フォーム:UserForm1
リストボックス:ListBox1
コマンドボタン:CommandButton1
キャプション等はプログラムで変更するので、既定値でOK。
◆コマンドボタンのイベントプロシージャ
コマンドボタンをダブルクリックして、フォームを閉じる処理を追加します。
Private Sub CommandButton1_Click() Unload Me End Sub
◆リストボタンのイベントプロシージャ
リストボックスをダブルクリックして、リストの項目が選択されたときの処理を追加します。
Private Sub ListBox1_Click() Dim Index As Integer Dim Buf As String Index = ListBox1.ListIndex 'ワークシートリストの選択された位置 Buf = ListBox1.List(Index) 'ワークシート名を取得 Worksheets(Buf).Activate ' セルA1を左上端にする Application.Goto Reference:=Range("A1"), Scroll:=True End Sub
◆フォームを表示するイベントプロシージャ
最後にフォームを表示するプロシージャを標準モジュールに作成します。
Sub ShowForm() Dim i As Integer For i = 1 To Worksheets.Count 'シート数分処理する If Worksheets(i).Name <> "data" Then 'シート名がdataならば表示しない UserForm1.ListBox1.AddItem (Worksheets(i).Name) End If Next i With UserForm1 .Height = 180 .Width = 240 .CommandButton1.Caption = "閉じる" ' ユーザーフォームのタイトルを設定 .Caption = "ワークシート選択" ' ユーザーフォームを表示 .Show (vbModeless) End With End Sub
上記のコードでは、「data」というシートがあれば、リストボックスに表示しないようにしています。また、フォームのタイトル、幅、高さ、コマンドボタンのキャプションを設定するとともに、Showメソッドでフォームを表示しています。Showメソッドの引数にvbModelessを指定することによって、フォームを表示したままセルの操作が可能になります。
◆実行結果
ShowFormプロシージャにカーソルを置き、F5キーを押すとフォームが表示されます。
リストボックスで項目をクリックすると、そのシートが表示されます。また、項目をクリックした後はキーボードの↓↑キーを押すことによって高速にシートを切り替えることができます。
◆ブックが開いたとき、フォームを表示する
ブックが開いたとき、ShowFormプロシージャ一を実行して、フォームを表示すると便利です。
VBAのIDEで、ThisWorkbookをダブルクリックして選択し、以下のコードを貼り付けます。
Private Sub Workbook_Open() Dim mySheet As Worksheet ' ShowFormというマクロにCtrl+Shit+Sのショートカットキーを割り当てる Application.OnKey "+^S", "ShowForm" ' ワークシート保護 ' ユーザーの手動操作では一部の機能を使用不可とするが、マクロからは全ての操作を使用できる For Each mySheet In Worksheets mySheet.Protect UserInterfaceOnly:=True Next mySheet ' ユーザーフォームを表示する Call ShowForm End Sub
Workbook_Open()プロシージャは、ブックが開いたときに自動実行されるマクロです。フォームを表示するだけなら、最後の行の
Call ShowForm
だけで可能ですが、
ここでは、ShowFormというマクロにCtrl+Shit+Sのショートカットキーを割り当てています。これによって一旦フォームを閉じた後でも、キーボードからCtrl+Shit+Sを押すことによって、いつでもフォームを表示させることができます。
また、すべてのワークシートに対して保護をかけています。Protectメソッドの引数にUserInterfaceOnly:=True
を指定することによって、ユーザーの手動操作では一部の機能を使用不可とし、マクロからは全ての操作を使用できるようにしています。