ユーザーフォームの基礎

前回の記事ではユーザーフォームの実行方法を中心に解説しました。
では今回からはユーザーフォームの作成を中心に解説していきます。

UserForm.xlsm

上記のExcelに入っているユーザーフォームのコードについて解説していきたいと思います。
Private Sub UserForm_Initialize()
With UserForm1
    .Caption = "この中で好きな映画のジャンルは?"
    .Width = "190"
    .Height = "140"
End With
With ListBox1
    .Width = "170"
    .Height = "10"
    .Top = "5"
    .Left = "10"
    .ColumnCount = 2
    .ColumnWidths = "40;90"
    .TextAlign = fmTextAlignCenter
    .AddItem ""
    .List(.ListCount - 1, 0) = "ジャンル"
    .List(.ListCount - 1, 1) = "例"
End With
With ListBox2
    .Width = "170"
    .Height = "70"
    .Top = "20"
    .Left = "10"
    .ColumnCount = 2
    .ColumnWidths = "40;90"
    .TextAlign = fmTextAlignCenter
    .AddItem ""
    .List(.ListCount - 1, 0) = "アクション"
    .List(.ListCount - 1, 1) = "ジャッキーチェン等"
    .AddItem ""
    .List(.ListCount - 1, 0) = "恋愛"
    .List(.ListCount - 1, 1) = "花より男子等"
    .AddItem ""
    .List(.ListCount - 1, 0) = "コメディ"
    .List(.ListCount - 1, 1) = "Mr.ビーン等"
    .AddItem ""
    .List(.ListCount - 1, 0) = "SF"
    .List(.ListCount - 1, 1) = "スターウォーズ等"
    .AddItem ""
    .List(.ListCount - 1, 0) = "ホラー"
    .List(.ListCount - 1, 1) = "リング等"
    .AddItem ""
    .List(.ListCount - 1, 0) = "アニメ"
    .List(.ListCount - 1, 1) = "ディズニー等"
End With
With CommandButton1
    .Visible = True
    .Width = "70"
    .Height = "25"
    .Top = "90"
    .Left = "15"
    .Caption = "決定"
End With
With CommandButton2
    .Visible = True
    .Width = "70"
    .Height = "25"
    .Top = "90"
    .Left = "105"
    .Caption = "キャンセル"
End With
End Sub
Private Sub CommandButton1_Click()
If ListBox2.ListIndex = -1 Then
    MsgBox "好きなジャンルを選んでください"
Else
    ActiveCell.Value = ListBox2.List(ListBox2.ListIndex, 0)
    ActiveCell.Offset(0, 1).Value = ListBox2.List(ListBox2.ListIndex, 1)
    Unload Me
End If
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Sub Sample()
    UserForm1.Show
End Sub
今回解説するExcelに含まれてるコードは上記の通りです。
※上記コードのみはこちらにも記載しています。

ユーザーフォームのイベント

ユーザーフォームを使う上で1番大事になるのが「イベント」です。
イベントとは、ワークシートイベントと同じで、Click等の動作を検出し、その動作に合わせた処理を実行させることです。

Private Sub UserForm_Initialize()
Private Sub CommandButton1_Click()
Private Sub CommandButton2_Click()

Private Sub


上記の3種類から分かるように「Private Sub」は共通部分になります。

この話はまた別のページで解説しますので省略しますが、Privateに関しては呼び出せる範囲を表しています。

UserFormやCommandButton1等


次にUserFormCommandButton1等の部分に関しては、対象のオブジェクトを指定しています。
指定する際には、対象のオブジェクトの「オブジェクト名」を使用します。
オブジェクト名

_Initialize()や_Click()


ここでは対象のオブジェクトに対するイベントを記載します。
_Initializeとは英語で初期化を意味し、VBAでは新しくフォームを読み込むということを表します。
_Clickはそのままクリックした時を意味します。

イベントは他にも多数ありますが、基本的には上記の2つを覚えておけば大丈夫です。

ユーザーフォームのプロパティ

ユーザーフォームのプロパティは多数ありますが、今回は解説しているExcelで使用しているプロパティだけを紹介します。

プロパティ 意味
Caption オブジェクトに表示される文字
Width オブジェクトの横幅
Height オブジェクトの縦幅
Top ユーザーフォームの上からの位置
Left ユーザーフォームの左からの位置
Visible 可視化(表示)するか
AddItem データの作成
ColumnCount リストの列数
ColumnWidths リストの列の横幅
TextAlign 文字の垂直方向の揃え位置
List リストの位置
ListIndex リストの上からの位置(0から始まる)

Caption


Captionはオブジェクトに表示する文字なので、例えばユーザーフォームの場合は、ユーザーフォームのタイトルバーになります。
また、CommandButtonに対してのCaptionの場合は、ボタンに表示されている文字になります。

Width,Height,Top,Left


これらは位置や大きさに関するプロパティになります。
ユーザーフォームそのものの大きさをWidthとHeightで決め、リストボックスやコマンドボタンはWidthとHeightで大きさを決めた上で、TopやLeftで表示位置を指定します。

Visible


こちらは今までのIEの自動操作でも説明したいように、「可視化するか」の意味なので、「True」もしくは「False」で可視化をするかしないかを決めてください。

AddItem


AddItemに関しては、リストボックスを作成する際には必ず使うことになると思います。
AddItemではデータを作成しますので、AddItem ""の中に入れた文字列を直接リストにすることが出来ます。

また、ForやIEの操作と組み合わせることでExcelやサイト上のリストをユーザーフォームに表示することも出来ます。

ColumnCount,ColumnWidths


ColumnCountでは、例えばリストを表の様に複数列の情報を表示したい時、「""」に入れた数だけ列を作ることが出来ます。
ColumnWidthsでは、ColumnCountで作った列の幅を調整することが出来ます。
例えば1列目は文字が少ないが2列目は文字が多い時、サイズを指定することで折り返しの調整をすることも出来ます。

TextAlign

TextAlignでは文字列を「左揃え」「中央揃え」「右揃え」にすることが出来ます。
表記は左揃えから「fmTextAlignLeft」「fmTextAlignCenter」「fmTextAlignRight」となります。

List,ListIndex

ここは注意してください。
まず、イメージとしては、「Listではリストボックスを表と同じように列と行で取得できる」というイメージです。
次に「ListIndexではリストボックスを行だけでリストとして取得できる」というイメージです。
つまりListIndexでは1を指定したら2行目全てを取得しますが、ListではCellsの様に(行, 列)を指定して、ピンポイントを取得することが出来るのです。

最後に

ここまででユーザーフォームのイベント、プロパティ等を解説してきました。
このイベントとプロパティを元に、次回は実際のコードについて解説していきたいと思います。

ユーザーフォームになっても今までのExcelの表と同じように「オブジェクト.プロパティ = ○○」のような表記でコーディングするので、難しく考えることなく、1歩ずつ進んでいってください。