みなさん、こんにちはケンケンです。
今回は、ユーザーフォームの活用に欠かせないスクロールバーについてご紹介します。
以前にご紹介した知識が前提になっていますので、まだ記事をご覧になっていない方や、忘れてしまった方は以下から確認してください。
【ExcelVBA】ユーザーフォーム活用テクニック編【チェックボックス】
【ExcelVBA】ユーザーフォーム活用テクニック編【リストボックス】
スクロールバーの作り方
今回は、スクロールバーを作って新しいアクションを追加していきます。
完成形を先にお見せします。
以上のようなアクションを起こせるようにします。
スクロールバーをマスターしてより複雑なフォームを作れるようになりましょう。
スクロールバーを配置しよう
まず、スクロールバーを配置します。
ツールボックスからスクロールバーを選択して、フォームの右の余白にドラッグして作ります。
部品を作ったらすぐオブジェクト名を変更します。
今回は、「scrMain」としました。
スクロールバーの初期値を設定しよう
配置とオブジェクト名の変更ができたら、スクロールバーの初期値をイニシャライズイベントで設定します。
ここでは、スクロールバーの
- 最小値
- 最大値
- 初期値
を設定します。
まずは、Initializeプロシージャを生成します。
フォームの余白をダブルクリックし、右上のプルダウンよりInitializeを選択します。
出来たプロシージャの中に以下のように記述します。
Private Sub UserForm_Initialize() scrMain.Min = 2 '① scrMain.Max = Range("B" & Rows.Count).End(xlUp).Row + 1 '② scrMain.Value = 2 '③ End Sub
①Minプロパティで最小値を設定します。最小値は2としました。データ元のエクセルシートのデータが2行目から始まっているので、そこに合わせてます。
②Maxプロパティで最大値を設定します。エクセルシートB列の最終行+1行目を取得しています。
③Valueプロパティで初期値を設定します。フォームを起動した時に入る値です。2行目を初期値としました。
①~③のイメージは以下の通りです。
ここまでできると、フォームを起動してスクロールさせることができます。
ただ、データを表示したり修正したりすることはできないので、これから追加していきます。
Changeイベントとボタンクリック時のアクション
スクロールバーのChangeイベントでは、スクロールさせるごとに起こるアクションを設定できます。
スクロールに合わせてテキストボックスにデータを表示してみよう
スクロールと連動してテキストボックスにデータを表示させます。
まず、Changeイベントを使ってスクロールした時の仕組みを作ります。
作成されたプロシージャに以下のように記述します。
Private Sub scrMain_Change() txtName.Value = scrMain.Value End Sub
スクロールバーの値(scrMain.Value)をテキストボックスtxtNameに代入しています。
この状態でフォームを起動しましょう。
氏名に数字の2が入りました。これは、スクロールバーの初期値を意味しています。
この状態でスクロールすると
テキストボックスの値も3に変更されました。
この性質を生かして、シート上のデータを表示させます。
先ほどのコードを以下のように変更します。
Private Sub scrMain_Change() txtName.Value = Range("B" & scrMain.Value).Value End Sub
フォーム起動時には、scrMain.Valueの値は2なので、B2セルの値(田中太郎)をテキストボックス(txtName)に代入せよ。という意味になります。
テキストボックスに以下のように表示されていれば成功です。
そして、スクロールするごとに氏名が変更されることを確認してください。
それでは、すべてのデータを表示できるようにコードを追記します。
Private Sub scrMain_Change() txtName.Value = Range("B" & scrMain.Value).Value txtFurigana.Value = Range("C" & scrMain.Value).Value '① txtAge.Value = Range("D" & scrMain.Value).Value '① txtJyusyo.Value = Range("E" & scrMain.Value).Value '① txtTel.Value = Range("F" & scrMain.Value).Value '① txtMail.Value = Range("G" & scrMain.Value).Value '① txtTel2.Value = Range("H" & scrMain.Value).Value '① txtMail.Value = Range("G" & scrMain.Value).Value '① If Range("I" & scrMain.Value).Value = "退職" Then '② chkTaisyoku.Value = True Else chkTaisyoku.Value = False End If End Sub
①エクセルシートの各データをそれぞれのテキストボックスに表示させています。これは特に難しくないと思います。
②チェックボックスの条件分岐にも「scrMain.Value」が使えます。該当したセルの値が「退職」か否かでチェックボックスにチェックを入れるか入れないかの分岐をしています。
ここまでできたらフォームを起動して確認します。
データがすべて反映されていたら成功です。
修正・更新をしてみよう
次は、フォームを修正するとエクセルシートも修正できるようにしてみましょう。
入力ボタンをダブルクリックして、クリックイベントプロシージャに記述します。
Private Sub btnInput_Click() 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 End Sub
①エクセルシートのA列にデータ番号を振りたいので、今回は、スクロールバーの値から1マイナスした値をA列に代入しています。
②各テキストボックスの値をエクセルシートに代入しています。
Changeイベントでエクセルシートのデータをテキストボックスに表示させた方法の逆の考え方と理解してください。
③チェックボックスにチェックが入っているときは「退職」、そうでない場合は「在職」とエクセルシートに記述します。
フォームを起動して実際にデータを修正して入力ボタンをクリックしてみてください。
エクセルシートが修正されていればOKです。
スクロールの値によって入力ボタンのCaptionを変えてみよう
入力ボタンのCaptionを適宜変更することによって、フォームの利便性を高めることができます。
今回は、scrMain.valueがMaxの時は「新規登録」、Max以外の時は「修正・更新」とCaptionを変えてみます。
コードはscrMain_Changeプロシージャに以下のように追記します。
Private Sub scrMain_Change() txtName.Value = Range("B" & scrMain.Value).Value txtFurigana.Value = Range("C" & scrMain.Value).Value '① txtAge.Value = Range("D" & scrMain.Value).Value '① txtJyusyo.Value = Range("E" & scrMain.Value).Value '① txtTel.Value = Range("F" & scrMain.Value).Value '① txtMail.Value = Range("G" & scrMain.Value).Value '① txtTel2.Value = Range("H" & scrMain.Value).Value '① txtMail.Value = Range("G" & scrMain.Value).Value '① If Range("I" & scrMain.Value).Value = "退職" Then '② chkTaisyoku.Value = True Else chkTaisyoku.Value = False End If '-------------------この下追記--------------------------------------------- If scrMain.Value = scrMain.Max Then btnInput.Caption = "新規登録" Else btnInput.Caption = "修正・更新" End If End Sub
Captionをコードで変更したい時は上記のように書きます。
条件分岐の記述方法は基本的なものなので問題ないかと思います。
フォームを起動して確認します。
連続して新規登録できるようにしよう
現状だと新規登録した場合、連続して登録することができません。
これを解決するためには、新規登録したその瞬間にスクロールバーの値に変化を生じさせれば良いでしょう。
具体的には、scrMain.Maxの値を登録完了直後にひとつ増加させれば可能です。
登録完了直後なのでbtnInput_Clickプロシージャにコードを記述します。
Private Sub btnInput_Click() 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
「scrMain.Value = scrMain.Max」は「新規登録の時」と言いかえることが出来ますね。
新規登録完了後にスクロールバーのMax値に1プラスして、その値をスクロールバーの値に代入することで強制的に1つ下にスクロールさせているイメージです。
これで連続して新規登録できるはずです。
まとめ
フォーム作成も少しずつ複雑になってきましたが、今回紹介したくらいまで出来るとかなり便利なものも作れるようになるはずです。
復習して自分のものにし実務に役立ててください。
今後もフォーム作成についてのテクニックを随時ご紹介する予定なので、お楽しみに!
みなさん、こんにちはケンケンです。 今回もユーザーフォームの活用方法をご紹介します。 今までの記事をご覧いただいていない方は以下をお読みいただくことをおススメします。 【ExcelVBA】ユーザーフォー[…]
ユーザーフォーム活用関連記事一覧
【ExcelVBA】ユーザーフォーム活用の基礎【業務改善の強力な武器になります】
【ExcelVBA】ユーザーフォーム活用テクニック編【チェックボックス】
【ExcelVBA】ユーザーフォーム活用テクニック編【イニシャライズとリストボックス】
【ExcelVBA】ユーザーフォーム活用テクニック編【スクロールバーについて】