フォームの入力データをセルに反映

フォーム上にコントロールを貼り付けて、画面を作れるようになりました。このフォームで入力されたデータをセルに設定する方法を、例題を作成して説明します。 電気製品の表があるとします。フォームで順に商品名を表示させて、金額を入力し、金額をセルの一覧表に設定します。図21のように電気製品の表を作成します。

図21:電気製品の表

フォームにはコントロールのラベル、テキストボックス、ボタンを貼り付けます。

図22:金額入力フォーム

フォームに貼り付けたコントロールの説明をします。Label1のプロパティのCaptionに「商品名」、Label3のプロパティのCaptionに「金額」を設定します。Label2はVBAでセルから読み込んだ商品名を表示するので、貼り付けた時のデフォルト値Label2のままにしておきます。

テキストボックスはLabel3の右に張り付けます。マクロを使う人に金額を入れてもらう場所です。ボタンは2個貼り付けます。CommandButton1のプロパティのCaptionに「セル設定」CommandButton2のプロパティのCaptionに「終了」を設定します。

初期設定、ボタン1(セル設定)、ボタン2(終了)のVBAを作成します。

[リスト6]UserFormのVBA(セル設定例題.xlsm)

Dim y                   '(1)
'*********
'初期設定
'*********
Private Sub UserForm_Initialize()    '(2)
   y = 3
   Label2.Caption = Cells(y, 2)
   TextBox1.Text = ""
   TextBox1.SetFocus
End Sub

'*********
'セル設定
'*********
Private Sub CommandButton1_Click()   '(3)
   Cells(y, 3) = TextBox1.Text    '(4)
   y = y + 1
   If Cells(y, 2) = "" Then       '(5)
       MsgBox ("処理終了しました")
       End
   End If
   Label2.Caption = Cells(y, 2)   '(6)
   TextBox1.Text = ""
   TextBox1.SetFocus
End Sub

'***********
'終了
'***********
Private Sub CommandButton2_Click()    '(7)
   End
End Sub

VBAで書く場合プロシージャ(SubからEnd Subまでのひと固まりのVBA)を1ブロックとして、1ブロックを書く順番はどの順に書かれていても良いようになっています。(3)のプロシージャと(7)のプロシージャの順番が逆でもかまいません。簡単なものから書いていきましょう。

まずボタン2(終了)をダブルクリックします。(7)のClickイベントハンドラができるので、「End」を書きます。

次にボタン1(セル設定)をダブルクリックします。(3)のClickイベントハンドラができます。(4)はテキストボックスのデータをy行c列に設定しています。y行を一つ進めて、表が終了になったときはメッセージボックスを表示します。表が終了でない場合は(6)でy行の商品名をフォームのラベルに設定しています。テキストボックスをクリアして、入力位置をテキストボックスに設定します。「TextBox1.SetFocus」でテキストボックスにカーソルを移動させます。

フォームの処理を開始する時、最初yに開始行を設定し、一行目のデータをフォームに表示するために(2)を作成します。前にも書いたように、コードブロックの上のコンボボックスの左側でUserFormを選び、右側でInitializeを選んでInitializeイベントハンドラを表示させます。今回yの開始行は3です。(1)の変数yはフォーム全体で使用するので、コードブロックのプロシージャの外に宣言します。

セルにボタンを付けてフォームを呼び出しましょう。[挿入]-[標準モジュール]でVBAを入力する画面を出してください。コードの内容はリスト2で説明したものと同様です。

[リスト7]FormDisp(セル設定例題.xlsm)

Sub FormDisp()
   UserForm1.Show
End Sub

[開発]-[挿入]-[ボタン(フォームコントロール)]を選び、ボタンのマクロの登録で「FormDisp」を選びます。実行して確認してください。

図23:セル設定例題実行画面