みなさん、こんにちはケンケンです。
今回もユーザーフォームの活用方法をご紹介します。
今までの記事をご覧いただいていない方は以下をお読みいただくことをおススメします。
【ExcelVBA】ユーザーフォーム活用テクニック編【チェックボックス】
【ExcelVBA】ユーザーフォーム活用テクニック編【リストボックス】
【ExcelVBA】ユーザーフォーム活用テクニック編【スクロールバーについて】
今回は、リストボックスを選択することで、そのデータをテキストボックスに表示させる機能とメッセージ機能を実装します。
リストボックスとテキストボックスを連動させよう
リストボックスに表示されたデータをダブルクリックすることによって、そのデータがテキストボックスに表示されるように連動させていきます。
前回までに作った資料と完成形
前回までに作った資料を元に進めます(以下参照:社員名簿シート・社員データ入力フォーム・リスト表示フォーム)
完成形は以下のようになります。
リストの任意のデータを選択するとテキストボックスに表示されます。
当然そのフォームから修正することも可能です。
ダブルクリックイベントのプロシージャを作成しよう
それではまず、リストボックスを表示させ、ダブルクリックしたときのイベントを発生させるプロシージャを作成しましょう。
以下の図の通り進めてください。
上記のようにイベントプロシージャが作れたらOKです。
そのプロシージャに次のようにコードを書きます。
1 2 3 4 5 6 7 |
Private Sub lstHyouji_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim targetRow '① targetRow = lstHyouji.ListIndex '② Userform1.scrMain.Value = targetRow + 2 '③ Unload Me '④ End Sub |
コードの解説をします。
①変数targetRowを宣言します。この変数に、選択したリストボックスの行数を格納します。
②ListIndexでリストボックス内の行数を指定できます。前回ご紹介した通りリストボックスの行は0から始まります。
ですので、リストボックスの1行目を選択した場合、変数targetRowには0が格納されます。
③ここは少し説明が必要です。
まず、前回までに作成したテキストボックスのフォームとコードを見てみます。
スクロールバーの値が変更されるとテキストボックスの表示が切り替わるように設定していました。
この性質を生かします。
つまり、リストボックスをダブルクリックで選択した時に、
- リストボックスの行数(ListIndex)をスクロールバーの値に代入
- 代入された値に対応してスクロールバーのChangeイベントを発生させテキストボックスの表示を切り替える
という手順を経ればよさそうです。
では、スクロールバーの値(Userform1.scrMain.Value)にtargetRowの値をそのまま格納すればよいでしょうか。
違いますね。
先ほども触れましたが、targetRowに格納されている値はListIndexの値なので0から始まっています。
さらに、scrMain.Valueの初期値は2でしたね。
そうなると、scrMain.ValueとtargetRowには常に差が2あるということなので、targetRowにプラス2してあげるとお互いの行数が合致します。
コードを読み込むとscrMain.Valueの値が変わりスクロールバーのChangeイベントが発生します。
④フォームを閉じるコードです。
リストを選択した後もリストフォームが残っていると邪魔なので閉じてしまいます。
こういう細かいテクニックは使う人の利便性も考えて常に心がけてください。
これで完成です。コードのボリュームは少ないですが、仕組みをうまく作らないと機能しないので良く理解しておきましょう。
登録・修正するときにメッセージを起動させよう
先ほども少しお話ししましたが、ユーザーフォームを作るときは使う人のことを意識する必要があります。
前回までに作成したフォームでは不十分な箇所があります。
それは、新規登録や修正した際に、本当に実行して良いか確認するメッセージが表示されていない点です。
間違いやうっかりを減らすために重要かつ基本的なところです。
完成形を確認しよう
修正・更新ボタンもしくは新規登録ボタンを押すと確認のメッセージが表れ、「はい」を選択すると実行され「いいえ」を選択するとプロシージャから抜けるようにします。
メッセージボックスを表示させるコードを書いてみよう
それでは、コードを書いていきましょう。
UserForm1の修正・更新ボタンをクリックしてプロシージャにコードを書きます。
前回書いたコードに追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Private Sub btnInput_Click() Dim kakunin '① If btnInput.Caption = "新規登録" Then '② kakunin = MsgBox("登録します。よろしいですか?", vbYesNo + vbInformation, "確認") '③ If kakunin = vbNo Then '④ Exit Sub End If Else kakunin = MsgBox("変更します。よろしいですか?", vbYesNo + vbInformation, "確認") '⑤ If kakunin = vbNo Then '④ Exit Sub End If End If '----------------------------この上を追記------------------------------------------------------- Range("A" & scrMain.Value).Value = scrMain.Value - 1 Range("B" & scrMain.Value).Value = Userform1.txtName.Text Range("C" & scrMain.Value).Value = Userform1.txtFurigana.Text Range("D" & scrMain.Value).Value = Userform1.txtAge.Text Range("E" & scrMain.Value).Value = Userform1.txtJyusyo.Text Range("F" & scrMain.Value).Value = Userform1.txtTel.Text Range("G" & scrMain.Value).Value = Userform1.txtMail.Text Range("H" & scrMain.Value).Value = Userform1.txtTel2.Text If chkTaisyoku.Value = True Then Range("I" & scrMain.Value).Value = "退職" Else Range("I" & scrMain.Value).Value = "在職" End If If scrMain.Value = scrMain.Max Then scrMain.Max = scrMain.Max + 1 scrMain.Value = scrMain.Max End If End Sub |
コードの解説をします。
①メッセージボックスの結果を格納するための変数を宣言します。
②If文で条件分岐させます。
「新規登録」と「修正・更新」でメッセージを変えたいと思います。
そこでbtnInputのCaptionの状態で条件分岐させています。
③MsgBox関数は3つの引数をとります。
MsgBox(表示文字、ボタン設定、タイトル)のようになります。この順番で各引数を指定しています。
引数との対応図は以下のようになります。
「はい」を選択すると「vbYes」が「いいえ」を選択すると「vbNo」が結果として返ってきます。
④「いいえ」を選択したときつまり、「vbNo」が返ってきたときは、処理を進めてはいけませんね。
ですので、「vbNO」の場合は、さらに条件分岐して、プロシージャから「ExitSub」で抜けます。
逆に「vbYes」の場合は、以下の処理を実行します。
⑤btnInputのCaptionが新規登録でなかったら、つまり、「修正・更新」だったらメッセージを先ほどとは違う形で発信します。
メッセージボックスの引数に関しては先ほどと同じです。
これで準備は整いました。
実際に実行して確認してみましょう。
まとめ
いかがでしたか。
もう一度言いますが、フォームを作る際には、使う人のことを考えて部品を作るように心がけましょう。
特に、メッセージボックスや条件分岐を駆使することは利便性を高めるうえで必須のテクニックです。
ぜひ覚えておきましょう。
今後もさらにフォームをカスタマイズする方法をご紹介しますのでお楽しみに。
それでは、また次回お会いしましょう。
おすすめ記事
[エクセルVBA]ログを取って業務管理してみよう【業務改善の意識改革】
【ExcelVBA】ファイルとフォルダ操作の基礎【Dir関数・DoLoop】
エクセルで作った予定をGoogleカレンダーにインポートしちゃおうという話