【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行書いたり、、、

プログラミングって、そんなもん。。。

 

 

はい、そんな感じでユーザーフォームの紹介でした!

また、ユーザーフォームで面白い使い方あったら紹介しますね😊

今回は、長々とありがとうございました😓

まったねぇ🖐