Excel VBA ユーザーフォームを使用した入力フォームの作り方
仕事でVBAを使うことがあり、やりたいことはネットで調べていますが、VBA初心者の私が分かりづらかったものを、初心者でも分かるように説明したいと思います。
効率的なコードが書けていない可能性もありますので、予めご了承ください。
今回はユーザーフォームを使用した入力フォームの作り方を紹介します。
とてもシンプルなフォームを紹介していますので、ユーザーフォームの入門として参考にしていただければ嬉しいです。
使用ケース
データ入力するフォーマットが複雑だと、入力箇所を間違ってしまったり、誤って数式を消してしまったりすることがありませんか?特に特定多数の人が使用するファイルだとなおさらですよね。
そういったことを防ぐ方法の一つとして、フォーマットへ直接入力するのではなく、ユーザーフォームを使用し、入力フォームで入力する方法があります。
今回は例として、以下のような請求書を作成するフォーマットがあるとして、取引先名や住所、商品名など、可変部分をフォームで入力するようにしてみたいと思います。
完成イメージ
①「入力開始」ボタンをクリック。
②フォームが起動します。
③フォームに情報を入力し登録をクリック。
④フォームに入力した情報が反映。
※単価・金額は数式入れてます。
ブックオープンと同時にフォームを起動することもできますが、今回は分かりやすさを優先し、ボタンクリックでフォームが起動する仕様としました。
ユーザーフォームの作り方
まずはユーザーフォームの作り方を解説したいと思います。
①VBEを開き、挿入→ユーザーフォームを選択。
②ユーザーフォームが挿入されます。台紙みたいなものと思ってください。
③ドラッグしながらサイズを調整します。後からでも変更は可能です。
④表示→ツールボックスを選択。
⑤ツールボックスが表示されます。
⑥項目名を作成するため、ツールボックスからラベルを選択。
⑦ドラッグしながら任意の位置に配置します。
項目名はプロパティのcaptionで、「Label〇」の部分を変更することで、任意の項目名へ変更が可能です。
ラベルのサイズやフォントサイズもプロパティで調整しますが、今回は割愛させていただきます。
⑧値を入力するボックスを作成するため、ツールボックスからテキストボックスを選択。
⑨ドラッグしながら任意の位置に配置します。
⑩上記を繰り返し、必要な項目を全て作成します。
⑪キャンセルボタンと登録ボタンを作成するため、ツールボックスからコマンドボタンを選択。
⑫ドラッグしながら任意の位置に配置します。ボタン名はcaptionで変更が可能です。
⑬登録ボタンを作成し、フォームの側は完成です。
コードの書き方
フォームが完成したら、次にコマンドボタンを押した時の挙動をコードで書いていきます。
コードはプロジェクトの「コードを表示」をクリック、もしくは挙動を登録したいコマンドボタンをダブルクリックすると、コードウィンドウが開きます。
「コードを表示」から入ると設置したコマンドボタン分のSubが表示されない時があるため、コマンドボタンから入るといいかもしれません。
①「コードを表示」クリック、もしくは登録ボタンをダブルクリック
②コードが表示されます。
ここでは「CommandButton1_Click」がキャンセルボタン、「CommandButton2_Click」が登録ボタンを押した際の挙動になります。
サンプルコード
Private Sub CommandButton1_Click()
Unload UserForm1
End Sub
Private Sub CommandButton2_Click()
If TextBox1 = "" Then
MsgBox "取引先名が入力されていません。"
Exit Sub
End If
If TextBox2 = "" Then
MsgBox "郵便番号が入力されていません。"
Exit Sub
End If
If TextBox3 = "" Then
MsgBox "住所が入力されていません。"
Exit Sub
End If
If TextBox4 = "" Then
MsgBox "商品が入力されていません。"
Exit Sub
End If
If TextBox5 = "" Then
MsgBox "数量が入力されていません。"
Exit Sub
End If
With Sheets("請求書")
.Range("A5").Value = TextBox1.Text & " 御中"
.Range("A6").Value = " 〒 " & TextBox2.Text
.Range("A7").Value = TextBox3.Text
.Range("B16").Value = TextBox4.Text
.Range("B17").Value = TextBox5.Text
.Range("B18").Value = TextBox6.Text
.Range("B19").Value = TextBox7.Text
.Range("B20").Value = TextBox8.Text
.Range("B21").Value = TextBox9.Text
.Range("B22").Value = TextBox10.Text
.Range("B23").Value = TextBox11.Text
.Range("B24").Value = TextBox12.Text
.Range("B25").Value = TextBox13.Text
.Range("H16").Value = TextBox14.Text
.Range("H17").Value = TextBox15.Text
.Range("H18").Value = TextBox16.Text
.Range("H19").Value = TextBox17.Text
.Range("H20").Value = TextBox18.Text
.Range("H21").Value = TextBox19.Text
.Range("H22").Value = TextBox20.Text
.Range("H23").Value = TextBox21.Text
.Range("H24").Value = TextBox22.Text
.Range("H25").Value = TextBox23.Text
End With
For i = 1 To 23
UserForm1.Controls("Textbox" & i).Value = ""
Next i
Unload UserForm1
End Sub
Sub 作成()
UserForm1.Show
End Sub
コード解説
まずはキャンセルボタンを押した場合の挙動です。
「Unload UserForm1」でフォームを閉じます。
Private Sub CommandButton1_Click()
Unload UserForm1
End Sub
続いて登録ボタンを押した場合の挙動です。まずは空欄チェックです。
Ifを使い、指定したテキストボックスが空欄の状態だった場合、メッセージボックスを表示し、Exit Subで処理を終了させています。
今回は取引先名・郵便番号・住所・商品1の商品名と数量を必須項目として、いずれかが空欄だった場合、処理を終了します。
If TextBox1 = "" Then
MsgBox "取引先名が入力されていません。"
Exit Sub
End If
If TextBox2 = "" Then
MsgBox "郵便番号が入力されていません。"
Exit Sub
End If
If TextBox3 = "" Then
MsgBox "住所が入力されていません。"
Exit Sub
End If
If TextBox4 = "" Then
MsgBox "商品が入力されていません。"
Exit Sub
End If
If TextBox5 = "" Then
MsgBox "数量が入力されていません。"
Exit Sub
End If
テキストボックスに入力された内容をエクセルのフォーマットへ転記していきます。
Withステートメントを使い入力を簡易化しています。
取引先名には末尾に「␣御中「、郵便番号には先頭に「〒」を自動で追加するようにしています。後は入力内容をそのまま転記しています。
With Sheets("請求書")
.Range("A5").Value = TextBox1.Text & " 御中"
.Range("A6").Value = " 〒 " & TextBox2.Text
.Range("A7").Value = TextBox3.Text
.Range("B16").Value = TextBox4.Text
.Range("B17").Value = TextBox5.Text
.Range("B18").Value = TextBox6.Text
.Range("B19").Value = TextBox7.Text
.Range("B20").Value = TextBox8.Text
.Range("B21").Value = TextBox9.Text
.Range("B22").Value = TextBox10.Text
.Range("B23").Value = TextBox11.Text
.Range("B24").Value = TextBox12.Text
.Range("B25").Value = TextBox13.Text
.Range("H16").Value = TextBox14.Text
.Range("H17").Value = TextBox15.Text
.Range("H18").Value = TextBox16.Text
.Range("H19").Value = TextBox17.Text
.Range("H20").Value = TextBox18.Text
.Range("H21").Value = TextBox19.Text
.Range("H22").Value = TextBox20.Text
.Range("H23").Value = TextBox21.Text
.Range("H24").Value = TextBox22.Text
.Range("H25").Value = TextBox23.Text
End With
フォームに入力された内容をクリアします。
For文を使用し、Textbox1~23を「""」(空欄)にしています。
For i = 1 To 23
UserForm1.Controls("Textbox" & i).Value = ""
Next i
フォームを閉じて終了です。
Unload UserForm1
最後にフォームを呼び出すコードを、エクセルのシート上に設置したボタンクリックで実行するようにすれば完成です。
Sub 作成()
UserForm1.Show
End Sub
以上、ユーザーフォームを使用した入力フォームの作り方でした。
入門用として準備したものなので、コードなどはあまり実用的ではありませんが、まずはユーザーフォームの入り口として、誰かの参考になれば幸いです。
ユーザーフォームを使用した入力フォームの作り方
週ごとに縦に並んだ表を横並びにする方法 | Find&Set
セルに入力された日付を取得し自動でシートとファイルを作る方法
検索窓にキーワードを入力しEnterキーで検索するフォームの作り方 | Intersect
ブックを開いた時のウィンドウサイズを指定する方法 | workbook_open
新規ブックを作成しマクロが登録されたボタンを設置する方法 | OnAction
複数のワークシートをまとめて表示・非表示にする方法 | Visible Not.Visible
セル位置が変わっても特定の範囲を選択する方法 | Find&Address
電話番号からハイフンを削除し0から表示させる方法 | Evaluate&Replace
ダイアログボックスからファイルを選択して開く | GetOpenFilename