【VBA】仕事で使えるユーザーフォーム
ユーザーフォームとは
どうも!新型コロナウイルスを「ニュータイプ」と言いがちのjimです👍
今回は、VBAのユーザーフォームを紹介していきます。
とりあえす、「ユーザーフォームって何だ?」って話ですよね?
VBAに備わってる、ユーザーが自由にデザインできる入力フォーム。
その入力フォームのことをユーザーフォームって言うのね。
どんなものかってーと。。。
↑こんな感じのやつ。
Access以外のVBAには、こゆのが備わってます。(Accessのユーザーフォームは特殊)
コレで何ができるのか。って言うと、、、
まあ、色々できます!
最近、作ったゲームは、全部コレを使ってます✨
勿論、仕事でも使ってます。(すんごい使うよ)
ユーザーフォームの作成
まず、使いどころの前に、軽くユーザーフォームとツールボックスの説明いきます♩
とりあえず、挿入します。
こんな感じで、ユーザーフォームとツールボックスが表示されます。
ツールボックスを閉じてしまった場合は、表示タブから再表示できます。
自分が使い始めたころ、どうやって表示させたらいいのか分からなくて、ものすごく慌てた記憶がある😅{大体何か消えたら表示タブです)
それで次は、コントロールの挿入!
ツールボックスのコントロールをアクティブにして、ユーザーフォームでドラッグするとコントロールが作成されます。(詳しい説明は、もう少し先に書きますね)
↓よく使うコントロール
コントロールはそれぞれ、大きさ、色、フォントなど色々変更できます。
画像で見切れてるプロパティを使って変更できます。(コマンド使っても変更可能)
使う人が見やすいように色々試してみるといいと思います。
ユーザーフォーム使い道
「それで、いつ何処で使うの?」←コレだよね。
初心者からしたら、
『VBAで何ができるのか?ユーザーフォームで何ができるのか?』
こうゆうことが、分からないまま挫折したりね。残念過ぎると思います😢
で、何に使うか、、、
ゲーム!
ゲーム一択でしょ?ユーザーがキーボード叩くと、ラベルの座標を変更させて、座標が重なったら、こうこうこうして。。。
なーんつって😊
使い道は沢山あってぇ、、もう発想次第なんだけどぉ、、、
自分は、『何かと紐づけて、ユーザーの欲しい情報を表示させる。』ってのが多いかな。
(ひねらず普通のこと書いてしまった…)
1、ラベル、テキストボックス、コンボボックス、ボタン用意
2、ラベルで使い方を誘導
3、ユーザーがコンボボックスで日付を選択してボタンを押す
4、テキストボックスにユーザーが指定した日付の何かを表示する
みたいな感じ。
コントロールには、イベントが沢山用意されていて、そのイベントにコードを記述することが多いです。
で、そのコードに、『ファイルの編集』とか『テキストボックスに表示』とかっていうのを仕込むんです。
そんな感じの使い方が多いです😣
ユーザーフォームを使ってみる
例えば~のやつを実際に作ってみます。
とりあえず、エクセルに以下の簡単な表を作成します。(シート名は『表』)
A | B | C | |
1 | 日付 | 件数 | |
2 | 1 | 2020/4/1 | 3 |
3 | 2 | 2020/4/1 | 4 |
4 | 3 | 2020/4/2 | 5 |
5 | 4 | 2020/4/2 | 6 |
6 | 5 | 2020/4/3 | 7 |
ラベル、テキストボックス、コンボボックス、ボタン用意
コントロールをアクティブにして、ドラッグするだけで作成できます。
上記の要領でコントロールを用意します。
完成したら、プロパティでオブジェクト名を確認してください。
オブジェクトをアクティブにすると、プロパティにオブジェクト名が表示されます👈
このオブジェクト名と、何かしら紐づけていきます。(※これ重要)
『UserForm1』上に、
『Label1』『ComboBox1』『CommandButton1』『TextBox1』ができていますか?
オブジェクト名は任意で変更できますが、ここでは変更しません。
次に、標準モジュールを挿入して、ユーザーフォームを表示させるコードを記述します。
Option Explicit Sub hyouji() UserForm1.Show End Sub
これで、ユーザーフォームが表示が可能になりました。
もうオブジェクト名が出てきましたね。大事だよ~♪
ちなみに、標準モジュールでコントロールを操作する場合は、
『Userform1.Label1』のように何処の誰~っていうのを細かく指定します。
ラベルで使い方を誘導
コントロールプロパティのCaptionで、ラベルに表示させる文言を変更できます。
が、今回はコードを書いてCaptionを変更します🙋
ついでに、コンボボックスにも日付を格納しちゃいます🙋
ユーザーフォームの表示イベントがあるので、そこに一括してして記述しますね。
とりあえず、コードを記述する場所を表示させます。
先ず、フォームのUserForm1を右クリックして、コードの表示。
次に、UserForm_Initializeを表示させます(手打ちも可能)
そしたら、
ラベルの表示を『日付を選択してボタン』にするコードと、
コンボボックスに『2020/4/1~2020/4/3』を格納するコードを記述します。
Private Sub UserForm_Initialize() Dim i As Long Label1.Caption = "日付を選択してボタン" ' ComboBox1.AddItem "2020/4/1" ' ComboBox1.AddItem "2020/4/2" ' ComboBox1.AddItem "2020/4/2" For i = 1 To 3 ComboBox1.AddItem DateAdd("d", i - 1, "2020/4/1") Next End Sub
日付は、コメントアウトしてる方法でもいいですが、数が多い場合はループのがいいよね?
ユーザーがコンボボックスで日付を選択してボタンを押す
ボタンをクリックしたときのイベントを準備します。
『ラベル』の要領で、コマンドボタンをクリックした時のイベントを表示させます。
UserForm→CommandButton1
Initialize→Click
一応、コンボボックス未選択による実行で出るバグ回避で、エラーメッセージと中断するコードを記述しておきます。
Private Sub CommandButton1_Click() If ComboBox1 = "" Then MsgBox "日付を選択してください", vbOKOnly, "ダメ" Exit Sub End If End Sub
テキストボックスにユーザーが指定した日付の何かを表示する
今回は、コンボボックスで選択された日付を表で検索し、その日付の件数を合計し、テキストボックスに表示させるようにします。
↓まとめたコード
Option Explicit Private Sub CommandButton1_Click() Dim ws As Worksheet Dim i As Long If ComboBox1 = "" Then MsgBox "日付を選択してください", vbOKOnly, "ダメ" Exit Sub End If Set ws = ThisWorkbook.Worksheets("表") TextBox1 = 0 For i = 2 To ws.Cells(Rows.Count, 2).End(xlUp).Row If Format(ws.Cells(i, 2), "yyyy/mm/dd") = Format(ComboBox1, "yyyy/mm/dd") Then TextBox1 = TextBox1 + ws.Cells(i, 3) End If Next End Sub Private Sub UserForm_Initialize() Dim i As Long Label1.Caption = "日付を選択してボタン" ' ComboBox1.AddItem "2020/4/1" ' ComboBox1.AddItem "2020/4/2" ' ComboBox1.AddItem "2020/4/2" For i = 1 To 3 ComboBox1.AddItem DateAdd("d", i - 1, "2020/4/1") Next End Sub
記述できたら、実行してみましょう。
標準モジュールのコードを実行してユーザーフォームを表示させ、
コンボボックスの日付を変更してボタン⇒
テキストボックスに、合計された値が表示されましたか?
最後に
今回は、ユーザーフォームに計算結果を表示させましたが、逆に『ユーザーフォームの値を表に反映させる。』ってこともできます。
発想次第で何でもできちゃいます。
ただ、紐づけるのって大変だよね。作り込めば作り込むほど、、大変😣
だから、コントロール名を工夫してループ処理したりするけど、それでも、、、大変😓
本当にプログラミングって、地味だし泥臭いものなんだよね。
ある時は、1行のコード書くのに1日がかりで調べたり、、
またある時は、ほとんど調べないで、1日1000行書いたり、、、
プログラミングって、そんなもん。。。
はい、そんな感じでユーザーフォームの紹介でした!
また、ユーザーフォームで面白い使い方あったら紹介しますね😊
今回は、長々とありがとうございました😓
まったねぇ🖐
ディスカッション
コメント一覧
まだ、コメントがありません