67本目 ComboBoxとListBox(はじめてのユーザーフォーム)

VBA100本ノック

VBA100本ノック 67本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ


問題

#VBA100本ノック67本目
ユーザーフォームのListBoxに、ComboBoxの値で「リスト」シートのA列を絞りこんだデータを表示します。
ListBoxにはB列~D列を列見出しを付けて表示してください。
適宜作業シートを使用。
※オブジェクト名は任意
※コンボは都道府県が設定済としてイベントの作成です。

解答

Private Sub UserForm_Initialize()  'ユーザーフォームが起動したときに一度だけ起動する
    Me.ComboBox1.RowSource = Worksheets("都道府県").Range("A2:A48").Address(External:=True)
End Sub

Private Sub ComboBox1_Change()
    Dim wsリスト As Worksheet: Set wsリスト = Worksheets("リスト")
    Dim wsユーザーフォーム表示用リスト As Worksheet: Set wsユーザーフォーム表示用リスト = Worksheets("ユーザーフォーム表示用リスト")
    wsユーザーフォーム表示用リスト.Cells.Clear
    Dim 都道府県 As String: 都道府県 = Me.ComboBox1.Value
    
    With wsリスト.Range("A1").CurrentRegion
        .AutoFilter 1, 都道府県
        .Copy wsユーザーフォーム表示用リスト.Range("A1")
    End With
    wsリスト.AutoFilterMode = False
    
    With Me.ListBox1
        .ColumnCount = 4 '4列
        .ColumnHeads = True '見出しあり
        .RowSource = wsユーザーフォーム表示用リスト.Range("A1").CurrentRegion.Offset(1).Address(External:=True)
    End With
End Sub

Private Sub 終了ボタン_Click()
    MsgBox "終了するよ"
    Unload Me
End Sub

■考え方・流れ
0:00 冒頭・問題確認
1:57 ユーザーフォームって何ですか?
3:50 ユーザーフォームの作り方
6:07 ユーザーフォームのプロパティ
7:31 コントロールを追加する
8:47 コマンドボタンにマクロを割り当てる
10:34 コンボボックスにセルの値を設定する
14:17 リストボックスにセルの値を設定する
17:39 選択された都道府県でフィルターする
19:28 選択された都道府県のみリストボックスへ表示

新人君
新人君

初めてのユーザーフォームの
問題ですね!

ブチョ
ブチョ

俺は生まれた時から
知ってたけどね

新人君
新人君

お、おぉん…

ユーザーフォームって何ですか?

さて!じゃあまずは…
ユーザーフォームってなに???レベルから始めるぞ!!

ただ…すまんがここの解説は動画を見てくれ!!!

登録したいボタンを、ダブルクリックすると…

ユーザーフォームの作り方

よし!そしたらお次!
ユーザーフォームをどうやって作るのか!解説していくぞ!!

普段なにげなーく、標準モジュールを挿入していたところ…
実はこんなところに!ユーザーフォームがあるんすわ!!

それをクリックすると…!!
それっぽい画面に移行するぞ!!

そしたらお次!!
ユーザーフォームの起動のやり方なんだけど…
ココで必要なのが、「オブジェクト名」!!!!

プロパティウィンドウから確認してくれ!!

ちなみに、オブジェクト名は変更もできるぞ!!

ほんだら!!!お次!
ユーザーフォームを起動するには…
オブジェクト名.Show とすればOK!!!!

ユーザーフォームのプロパティの見方、扱い方等

よし!お次は!!!
ユーザーフォームのプロパティの見方、扱い方、考え方について軽くイメージつけていくぞ!!

これまでのVBAと全く?違うのは、
プロパティを取得するんじゃなくて、自分で作っていく感じだ!!!!

例えば一番上の「Userform1」って文字を変えたければ…
プロパティウィンドウのCaptionプロパティの値を変更してあげよう!

 

ただ、大きさや位置に関しては、オブジェクト本体(左のやつ)を操作して変更することもできるぞ!

コントロールを追加する

お次はコントロールを追加する方法!!
え?コントロールって何?
ピッチャーの制球がいいことだぞ!(大嘘)

とりあえず「コマンドボタン(一番左下)」とゆ~やつを追加してみた!

そしてこのコマンドボタンのプロパティを変更したい時も、
プロパティウィンドウからできちゃう!!すごい!!

コマンドボタンにマクロを割り当てる

よし!!お次は…
さっき作ったコマンドボタンを押したら、マクロが実行できるようにしていくぞ!!!

そうすると…
標準モジュール的な画面に飛んで、新しくプロシージャができたね!!

そしたらこの中にマクロを書いていけばOK!!なんだけど…
一つ覚えてほしいのが、この「Unload Me」ってやつ!!!

Meって言うのがこのユーザーフォーム本体を表してるぞ!!
これは後々使うからな!

コンボボックスにセルの値を設定する

よし!お次!
ココからがやっと、今日の問題について触れていくぞん!!

コンボボックスに、セルの値を設定していくぞ!!

・・・え?コンボボックスって何?
えーとね!こういう感じのやつだ!↓

コンボボックスを挿入したい時は、ツールボックスから挿入してあげてくれ!

おっし!!!
ユーザーフォームのコツはつかめたぜ!!!と言いたいんだが…
ココで一つ、欠かせないことを紹介させてくれ!!
それがこいつ↓

UserForm_Initializeの使い方は神髄さんのサイトを見てくれたらいいと思う!!
今回の「都道府県のリストをコンボボックスに設定」するような操作は、
ユーザーフォームを起動した一回だけ!設定すればいいから…
この中に書いていこう!

中に書くコードはこんな感じでいいぞ!(神髄さんのサイトのコードほぼマルパクリ)

ここまでで一旦実行すると…↓

リストボックスにセルの値を設定する

よし!続いては…
リストボックスにセルの値を設定していくぞ!!
え?リストボックスって何??
・・・下のこいつ…

リストボックスはここから!

ほんで!こいつにセルの値を設定したいんだけど…
どのプロシージャに書けばいいか分かるか???
俺は間違えた!!

コンボボックスを変えた時に、コンボボックスの値に合わせてリストボックスを変更したいから、
コンボボックス_Changeのプロシージャに書くのが正解だ!

ほんで…何を書いていけばいいかって言うと…
リストボックスには、列数、見出しの有無を決めてあげてくれ!!
後一旦、全てのリストを表示するコードを書いてあげてるぞ!!

実行結果↓
コンボボックスを変更したタイミングで、リストボックスに値が入ったぞ!!選択された都道府県でフィルターする

選択された都道府県でフィルターする

よし!もうすぐ完成だ!!
コンボボックスに設定された都道府県によって、リストボックスの中身を変えてあげよう!

まず、コンボボックスで選ばれた値を取得!して、”都道府県”って変数(雑かよ)に代入↓

続いて、AutoFilterメソッドさんで、リストシートのA列をフィルター!

一旦ここまでで実行↓

選択された都道府県のみリストボックスへ表示

よし!これで最後!!
リストボックスへ表示するコードに変更して終わりにしよう!!!

そのために…「リストボックスへ表示するためのシート」を準備して進めていくぞ!

これは復習だから…ある程度スルーしながら進めちゃおっと!!w

これで実行してみると…↓

.RowSourceの部分を変更して、完成!!

実行結果↓

長かった…お疲れさまでした!

ブチョ
ブチョ

お疲れさままままMAX!

新人君
新人君

お疲れさまでした!

あとがたり

おはこんばんちは。uぷ主です。
67本目、初めてのユーザーフォームの問題でした…

嘘だろ~!
てか、やっぱりと言うか…
さすがにやるよね~!
VBA100本ノックだもんね!

100本もあるんだもんね!!
ユーザーフォームもやらないとね!!

とは言いつつ…何から動画にしよう…と迷った結果、
ユーザーフォームを挿入するところから、全部やったろやないかい!!と決意。
そしたら…動画時間20分超えて…
非常にきつかった…www

あ、ちなみにどうでもいいんですけど、1分の動画作るのに大体30分~2時間ぐらいかかるんですよ。うちのゆっくり動画って。

いやーでも、これは…やってよかったんじゃないですかね??

ユーザーフォームの作り方とか、最初しらんかったもんなぁ…

誰か一人でも役に立ってたらいいな!(そう思わないとやってられないww)

コメント

タイトルとURLをコピーしました