お知らせこの記事はVBAでユーザーフォームの関連記事です
フォームとシートを繋ぎます
1つ前の記事からコードを書くという工程に入りました。
今回はより具体的なコードを紹介させていただきます。
前回はボタンに連動したコードを紹介しました。
他にもエクセルが立ち上がる時やフォームが立ち上がる時にコードを走らせることも出来ます。
合わせて紹介させていただきます。
ユーザーフォーム1つに対し1つのコードで終わる事はまずないです。
1つのフォームでもやる事を複数用意できます。
その時は指示毎にコードを用意する事になります。
前回記事
前回の記事はこちらです。
関連書籍
私はこちらの書籍でユーザーフォームを勉強しました。
電子書籍はこちらです。私は電子書籍をおすすめします。圧倒的に取り回しが楽だからです。
本記事での課題
今回の課題です。
コードの紹介
早速コードの紹介に入ります。まずは「登録」ボタンに紐付いたコードです。
Private Sub btn1_Click()
Dim パス As String 'ファイルパスを格納する変数
Dim ファイル名 As String 'ファイル名を格納する変数
Dim 車名 As String '転送先のエクセルでシートを指定する為の変数
Dim 最終行 As Long '転送先のエクセルで指定のシートにある値の最終行を格納する為の変数
'1、情報を受ける側のワークブックを開く
'パスとファイル名を変数に入れる。パスには最後¥を忘れないようにする。
パス = ThisWorkbook.Path & "\"
ファイル名 = "データ.xlsx"
'データを開く
Workbooks.Open パス & ファイル名
'指定のシートを開く
With Workbooks(ファイル名)
車名 = Me.cbxcarname
'2、フォームで選択した車種のシートを開く
With .Sheets(車名)
.Activate
'3、入力されたセルの最終行を確認
'最終行を認識する
最終行 = .Cells(Rows.Count, 1).End(xlUp).Row
'4、最終行の1つ下のセルにフォームの情報を貼り付ける
'必要事項の記入
.Cells(最終行 + 1, 1) = Me.txtdate
.Cells(最終行 + 1, 2) = Me.txtroute
End With
'5、情報を受ける側のワークブックを保存して閉じる
'保存して閉じる
Application.DisplayAlerts = False
.Save
.Close
Application.DisplayAlerts = True
End With
'6、フォームが用意されたワークブックに戻る
'各種コントロールの値をクリア
Me.cbxcarname = ""
Me.txtroute = ""
MsgBox "データを転送しました", , "入力完了"
End Sub
続いてフォームを起動させる際に備える情報を用意する為のコードはこちらになります。
Private Sub UserForm_Initialize()
'ユーザーフォームのテキストボックスに日付をセット
Me.txtdate = Date
'コンボボックスに車種をセット
With cbxcarname
.AddItem "プロボックス"
.AddItem "カローラ"
.AddItem "ノア"
.AddItem "カムリ"
End With
End Sub
最後にユーザーフォームを起動させるためのコードです。
Sub フォームを見せる()
UserForm1.Show vbModeless
End Sub
解説
では各コードについて解説していきます。
「登録」ボタンに紐付いたコード
どうやってコードを考えたのかについては前回の記事で紹介しましたので省略します。
簡単に言うと「手作業でやったらどうなるかを書き出してコードに置き換えるだけ」です。
コード内のコメントで指示した番号と以下記事の表題の番号を合わせてあります。
コード上でどこの話をしているのか分かる様にしてあります。
1_情報を受ける側のワークブックを開く
Workbooks.Open パス & ファイル名 でワークブックを見に行ってます。
ここでのポイントは2つです。
- パスを直書きせず変数に取っているところ
- パスとファイル名を繋ぐための¥マークを忘れずに変数に入れる様にしているところ
パスを変数に取るのはメンテナンスをしやすくする為だけです。
2_フォームで選択した車種のシートを開く
フォームでセットした車名をシート名にして.Activateで対象のシートをアクティブにしています。
3_入力されたセルの最終行を確認
よくある最終行の確認をするコードです。
最終行の取得方法については初心者様向けエクセルマクロ学習シリーズでかなり詳しく説明しています。
Cells(Rows.Count, 1).End(xlUp).Row を見て理解出来ない人は上の行のリンクをクリックです。
4_最終行の1つ下のセルにフォームの情報を貼り付ける
これもよくあるコードですので説明を省略します。
5_情報を受ける側のワークブックを保存して閉じる
ここも字のままですね。省略です。
6_フォームが用意されたワークブックに戻る
あとは不要な値を消したりメッセージボックスで作業が終わったことを伝えて終わりです。
あと重要なのはWithステートメントですね。
今回はWithステートメント自体がネスト構造になっています。普通のwithとは少し違います。
ユーザーフォームを勉強されている皆様ならきっと理解出来る内容だと思います。
Initialize プロシージャ
Private Sub UserForm_Initialize() というユーザーフォームを起動する際に使うコードを解説します。
まずこれがなんなのかという事を説明します。
Initializeイベントは対象のオブジェクトが起動する際事前に走るコマンドです。
具体的にはフォームが見える前にやることを指示するためのコードになります。
- コンボボックスに値をセットしておく
- テキストボックスに値をセットしてからユーザーフォームを表示させる
他にもありますがひとまずこの2つを例として挙げさせていただきました。
このプロシージャではtxtdateというテキストボックスにDate関数で日付を記入しています。
加えてcbxcarnameというコンボボックスにAddItemメソッドで値を追加しています。
今回のユーザーフォームは起動時に日付とコンボボックスに車種を用意する必要があります。
必要な情報をこのコードで用意しています。
ユーザーフォームを起動する為のコード
このコードは標準モジュールに書いてます。
.Showメソッドでフォームをアクティブにします。
引数で vbModeless を指定するとフォームを起動した際セルの画面を選択する事が可能になります。
- まずは.Showメソッドでフォームをアクティブにするための指示を与えます。
- 指示を受けたフォームはアクティブになる前にInitializeイベントが発動します。
- 値をセットしてからフォームがアクティブになります。
このような流れでフォームが見えるようになります。
まとめ
ユーザーフォームに関する一連の作業をみていただきました。次回が最後の記事になります。
標準モジュールに書いたコードとフォームのコードがどの様に連動して動いているのかを見ていただきます。
- フォーム特有のコードの書き方
- Withはネストが可能
- Initializeプロシージャの概要
Enjoy Excel
シリーズ初回でもお知らせした様にコアなところを勉強してもらう機会は別に作ります。
その為のフォームは用意出来ているのですがブログに落とし込むのにもう少し時間が必要です。
まずは次の記事を見ていただき今シリーズの勉強を進めてください。