【VBA入門】第5回:作った画面に命を吹き込む!入力データをシートに転記する「一番大切な処理」
こんにちは!
前回の第4回では、ユーザーフォームという「入力画面」を作りました。テキストボックスを並べて、ボタンを配置して……。「おっ、なんかアプリっぽくなってきたぞ!」とワクワクしたのではないでしょうか?
でも、今のままではそのボタンはただの飾りです。クリックしても何も起きません。これでは、中身のない箱と同じですよね。
第5回となる今回は、いよいよその箱に「命」を吹き込みます。
ユーザーフォームに入力した文字や数字を、ボタンひとつでExcelのシートへ自動的に積み上げていく。 これができるようになると、VBAの世界が一気に広がります。もう単なる「Excelの自動化」ではなく、「自分だけのアプリ開発」の始まりです。
今回は、初心者が最初につまずきやすい「データの最終行を探す」という処理も含めて、じっくり、丁寧に解説していきます。焦らず一緒にやっていきましょう。
今回のゴールイメージ
プログラミングをするときは、まず「やりたいこと」を具体的にイメージするのが成功のコツです。
今回作りたい動きはこうです。
- フォームに「日付」「商品名」「金額」を入力する。
- 「登録」ボタンをカチッと押す。
- Excelが自動的に表の「一番下の行」を見つける。
- その下の「新しい行」にデータを書き込む。
- 「登録しました!」と報告して、入力欄を空っぽにする。
この一連の流れを、コード(VBA)で書いていきます。
準備:シートとフォームの確認
前回からの続きになりますが、手元の環境が整っているか確認してください。
- 転記先のシート名:
Sheet1- 1行目には見出し(日付、商品名、金額)が入っている状態にしておいてください。
- フォームの部品名(オブジェクト名):
- 日付欄:
txtDate - 商品名欄:
txtItem - 金額欄:
txtPrice - 登録ボタン:
btnEntry
- 日付欄:
Step 1:「ボタンを押したとき」の場所を作る
VBAは、「何かが起きたとき」に動くプログラムです。今回は**「ボタンがクリックされたとき」**に動いてほしいですよね。
コードを書く場所(イベントプロシージャ)を準備しましょう。
- VBE(編集画面)で、前回作ったユーザーフォームを開きます。
- 配置してある**「登録ボタン」をダブルクリック**してください。
すると、白い画面が開いて、こんな文字が出てきたはずです。
VBA
Private Sub btnEntry_Click()
End Sub
この Private Sub から End Sub の間が、ボタン専用のスペースです。ここに書いた命令だけが、クリックした瞬間に実行されます。
Step 2:【ここが一番大事】「最終行」を見つける考え方
さて、いきなりコードを書く前に、少しだけ頭の体操をしましょう。
データをシートに転記するとき、常に「A2セル」に書き込むコードを書いてしまったらどうなるでしょうか? 1件目はいいですが、2件目を登録したとき、前のデータに上書きして消してしまいますよね。
だから、プログラムにはこう命令しないといけません。 「今あるデータの一番下を探して、その『ひとつ下の行』に書き込んでね」
これをVBAで実現するには、**「Excelの底から、エレベーターで上がっていく」**という考え方を使います。
魔法の呪文:End(xlUp)
実際のコードを見てみましょう。これが、VBAを使う人が一生使い続けることになる「最終行取得」のコードです。
VBA
Dim lastRow As Long
lastRow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row + 1
一見、暗号みたいですよね。でも、分解するとすごく単純な動作をしています。
Rows.Count- シートの本当の一番下の行(104万行目あたり)のことです。
Cells(Rows.Count, 1)- つまり、「A列の一番底にあるセル」を指差しています。
.End(xlUp)- ここがポイント。**「キーボードの Ctrl + ↑ キーを押したときと同じ動きをしろ」**という命令です。
- 一番下の何もないところからズドーン!と上に上がっていき、**「何かしら文字が入っているセル(=現在の最終行)」**にぶつかったら止まります。
+ 1- ぶつかったところは「データがある行」です。書き込みたいのはその下の「空行」なので、行番号にプラス1をします。
これで、変数 lastRow(ラストロウ)という箱の中に、書き込むべき行番号が入りました。
Step 3:データを書き込んで、きれいに後片付け
書き込む場所(行番号)さえわかってしまえば、あとは簡単です。「セルの値」=「テキストボックスの値」というコードを書くだけです。
でも、ただ書き込むだけだと「使い勝手」が悪いです。 入力した文字が残りっぱなしだと、次のデータを入力するときにいちいち消さなきゃいけませんよね?
そこで、**「書き込んだら、箱を空っぽにする(クリア処理)」**までをセットで書いてあげましょう。これが「気が利くプログラム」の第一歩です。
完成したコードがこちら
以下のコードを、先ほどの Private Sub... の中に書いてみてください。(コピーして貼り付けてもOKですが、できれば手で打ってみると覚えやすいですよ!)
VBA
Private Sub btnEntry_Click()
' 1. 変数の準備(行番号を入れる箱)
Dim lastRow As Long
' 2. 最終行を見つける(シートを指定するのを忘れずに!)
With Worksheets("Sheet1")
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
End With
' 3. データを転記する
' Cells(行番号, 列番号)を使います
With Worksheets("Sheet1")
.Cells(lastRow, 1).Value = txtDate.Value ' A列に日付
.Cells(lastRow, 2).Value = txtItem.Value ' B列に商品名
.Cells(lastRow, 3).Value = txtPrice.Value ' C列に金額
End With
' 4. ユーザーに完了を伝える
MsgBox "登録しました!"
' 5. 次のために後片付け(入力欄を空にする)
txtDate.Value = ""
txtItem.Value = ""
txtPrice.Value = ""
' 6. カーソルを最初に戻してあげる(おもてなし)
txtDate.SetFocus
End Sub
ちょっとした解説
With Worksheets("Sheet1")ってなに?- 「ここから先は Sheet1 についての命令だよ」という宣言です。これを書くと、毎回
Worksheets("Sheet1").Cells...と長く書かなくて済むので、コードがすっきりします。
- 「ここから先は Sheet1 についての命令だよ」という宣言です。これを書くと、毎回
.Valueは必要?- 省略しても動くことが多いですが、初心者のうちは「値を扱っているんだ」と意識するために明記するのがおすすめです。
SetFocus(セットフォーカス)- これは地味ですが最高の機能です。登録が終わった瞬間、カーソル(点滅する棒)を「日付」の欄に戻します。これがあるだけで、マウスに持ち替えずに連続入力ができるようになります。
Step 4:実際に動かしてみよう!
さあ、緊張の瞬間です。実際に動くかテストしてみましょう。
- VBEの画面上部にある「再生ボタン(▶)」を押すか、キーボードの
F5キーを押します。 - ユーザーフォームが表示されたら、適当にデータを入力してみてください。
- 日付:12/15
- 商品名:みかん
- 金額:500
- 「登録」ボタンをクリック!
どうでしょうか? 「登録しました!」というメッセージが出て、Excelシートの一番下にデータが増えていれば大成功です。 そのまま2件目、3件目と登録してみてください。どんどん表が育っていく様子は、見ていて気持ちいいものですよ。
「あれ、動かない?」というときは
プログラミングにエラーは付きものです。失敗しても落ち込む必要はありません。「どこが違うのかな?」と探す作業こそが、一番の勉強になります。
- 「オブジェクトが必要です」と言われる
- テキストボックスの名前(
txtDateなど)のスペルが間違っていませんか?
- テキストボックスの名前(
- 1行目の見出しが消えてしまった!
- シートのA列が空っぽだと、プログラムは「あ、1行目が空いてるからここに書こう」と判断してしまいます。A1セルに見出しが入っているか確認してください。
まとめと次回予告
お疲れ様でした! 今回は、ユーザーフォーム編の中でも一番楽しい**「データ転記」**を実装しました。
今回のポイントは、コードそのものよりも**「ユーザーの使い勝手」**です。
- データが消えないように、自動で次の行を探す。
- 入力が終わったら、自動で欄をクリアする。
- 完了メッセージを出して安心させる。
こういう「小さな親切」をプログラムに組み込めるようになると、あなたの作るツールは周りの人から「使いやすい!」と感謝されるようになります。
さて、次回は?
でも、今のツールには一つ弱点があります。 「金額」の欄に、「あいうえお」と入れて登録ボタンを押してみてください。……そのまま登録されちゃいますよね?
これでは計算ができなくて困りますし、必須項目が空欄のまま登録されるのも防ぎたいところです。
そこで次回、**第6回では「入力チェック(バリデーション)」**を解説します。「数値以外はNG!」「空欄はダメ!」と、門番のようにデータをチェックする機能を追加して、より完璧なアプリに近づけていきましょう。
次回も、わかりやすく噛み砕いて解説しますので、楽しみにしていてくださいね!
