【VBA入門】第5回:作った画面に命を吹き込む!入力データをシートに転記する「一番大切な処理」

こんにちは!

前回の第4回では、ユーザーフォームという「入力画面」を作りました。テキストボックスを並べて、ボタンを配置して……。「おっ、なんかアプリっぽくなってきたぞ!」とワクワクしたのではないでしょうか?

でも、今のままではそのボタンはただの飾りです。クリックしても何も起きません。これでは、中身のない箱と同じですよね。

第5回となる今回は、いよいよその箱に「命」を吹き込みます。

ユーザーフォームに入力した文字や数字を、ボタンひとつでExcelのシートへ自動的に積み上げていく。 これができるようになると、VBAの世界が一気に広がります。もう単なる「Excelの自動化」ではなく、「自分だけのアプリ開発」の始まりです。

今回は、初心者が最初につまずきやすい「データの最終行を探す」という処理も含めて、じっくり、丁寧に解説していきます。焦らず一緒にやっていきましょう。


今回のゴールイメージ

プログラミングをするときは、まず「やりたいこと」を具体的にイメージするのが成功のコツです。

今回作りたい動きはこうです。

  1. フォームに「日付」「商品名」「金額」を入力する。
  2. 「登録」ボタンをカチッと押す。
  3. Excelが自動的に表の「一番下の行」を見つける。
  4. その下の「新しい行」にデータを書き込む。
  5. 「登録しました!」と報告して、入力欄を空っぽにする。

この一連の流れを、コード(VBA)で書いていきます。

準備:シートとフォームの確認

前回からの続きになりますが、手元の環境が整っているか確認してください。

  • 転記先のシート名:Sheet1
    • 1行目には見出し(日付、商品名、金額)が入っている状態にしておいてください。
  • フォームの部品名(オブジェクト名):
    • 日付欄:txtDate
    • 商品名欄:txtItem
    • 金額欄:txtPrice
    • 登録ボタン:btnEntry

Step 1:「ボタンを押したとき」の場所を作る

VBAは、「何かが起きたとき」に動くプログラムです。今回は**「ボタンがクリックされたとき」**に動いてほしいですよね。

コードを書く場所(イベントプロシージャ)を準備しましょう。

  1. VBE(編集画面)で、前回作ったユーザーフォームを開きます。
  2. 配置してある**「登録ボタン」をダブルクリック**してください。

すると、白い画面が開いて、こんな文字が出てきたはずです。

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

一見、暗号みたいですよね。でも、分解するとすごく単純な動作をしています。

  1. Rows.Count
    • シートの本当の一番下の行(104万行目あたり)のことです。
  2. Cells(Rows.Count, 1)
    • つまり、「A列の一番底にあるセル」を指差しています。
  3. .End(xlUp)
    • ここがポイント。**「キーボードの Ctrl + ↑ キーを押したときと同じ動きをしろ」**という命令です。
    • 一番下の何もないところからズドーン!と上に上がっていき、**「何かしら文字が入っているセル(=現在の最終行)」**にぶつかったら止まります。
  4. + 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... と長く書かなくて済むので、コードがすっきりします。
  • .Value は必要?
    • 省略しても動くことが多いですが、初心者のうちは「値を扱っているんだ」と意識するために明記するのがおすすめです。
  • SetFocus(セットフォーカス)
    • これは地味ですが最高の機能です。登録が終わった瞬間、カーソル(点滅する棒)を「日付」の欄に戻します。これがあるだけで、マウスに持ち替えずに連続入力ができるようになります。

Step 4:実際に動かしてみよう!

さあ、緊張の瞬間です。実際に動くかテストしてみましょう。

  1. VBEの画面上部にある「再生ボタン(▶)」を押すか、キーボードの F5 キーを押します。
  2. ユーザーフォームが表示されたら、適当にデータを入力してみてください。
    • 日付:12/15
    • 商品名:みかん
    • 金額:500
  3. 「登録」ボタンをクリック!

どうでしょうか? 「登録しました!」というメッセージが出て、Excelシートの一番下にデータが増えていれば大成功です。 そのまま2件目、3件目と登録してみてください。どんどん表が育っていく様子は、見ていて気持ちいいものですよ。

「あれ、動かない?」というときは

プログラミングにエラーは付きものです。失敗しても落ち込む必要はありません。「どこが違うのかな?」と探す作業こそが、一番の勉強になります。

  • 「オブジェクトが必要です」と言われる
    • テキストボックスの名前(txtDateなど)のスペルが間違っていませんか?
  • 1行目の見出しが消えてしまった!
    • シートのA列が空っぽだと、プログラムは「あ、1行目が空いてるからここに書こう」と判断してしまいます。A1セルに見出しが入っているか確認してください。

まとめと次回予告

お疲れ様でした! 今回は、ユーザーフォーム編の中でも一番楽しい**「データ転記」**を実装しました。

今回のポイントは、コードそのものよりも**「ユーザーの使い勝手」**です。

  • データが消えないように、自動で次の行を探す。
  • 入力が終わったら、自動で欄をクリアする。
  • 完了メッセージを出して安心させる。

こういう「小さな親切」をプログラムに組み込めるようになると、あなたの作るツールは周りの人から「使いやすい!」と感謝されるようになります。

さて、次回は?

でも、今のツールには一つ弱点があります。 「金額」の欄に、「あいうえお」と入れて登録ボタンを押してみてください。……そのまま登録されちゃいますよね?

これでは計算ができなくて困りますし、必須項目が空欄のまま登録されるのも防ぎたいところです。

そこで次回、**第6回では「入力チェック(バリデーション)」**を解説します。「数値以外はNG!」「空欄はダメ!」と、門番のようにデータをチェックする機能を追加して、より完璧なアプリに近づけていきましょう。

次回も、わかりやすく噛み砕いて解説しますので、楽しみにしていてくださいね!

\ 最新情報をチェック /

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です