Excel VBAのテキストボックスの使い方をお探しですね。
広告
Excel VBA ユーザーフォームのテキストボックスに初期値を入れる・入力値を取得する方法
Excel VBAでユーザーフォームを作ると、テキストボックスにあらかじめ値を表示したり、入力された内容をセルに書き戻したりしたくなることがよくあります。
たとえば、住所入力フォームで前回の値を最初から表示しておきたい場合や、日付・担当者名・数量などを別の画面で入力してシートに反映したい場合などです。
この記事では、「ユーザーフォームのテキストボックスに初期値を入れる方法」と「入力値を取得する方法」を、初心者にも分かりやすく整理して解説します。
TextプロパティとValueプロパティの違い、Initializeイベントの使い方、セルとの連携、入力値を取得するタイミングまで、実務で迷いやすいポイントも含めて確認していきましょう。
1. テキストボックスに初期値を入れる基本
TextプロパティとValueプロパティ
ユーザーフォームに配置したテキストボックスに初期値を入れるには、主に`Text`プロパティか`Value`プロパティを使います。
テキストボックスは文字を入力するためのコントロールなので、表示されている文字列を扱う場合は次のように書けます。
“`vb
TextBox1.Text = “初期値”
“`
あるいは、こんな風にも書けます。
“`vb
TextBox1.Value = “初期値”
“`
実務ではどちらもよく使われますが、「入力欄に表示される文字そのもの」を意識するなら`Text`、「コントロールの値」として扱うなら`Value`と考えると分かりやすいです。
UserForm_Initializeイベントで初期値を設定する
一番基本的な方法は、ユーザーフォームを表示する前に発生する`UserForm_Initialize`イベントに初期値を設定するコードを書くことです。
`Initialize`は、ユーザーフォームが作られて表示される直前に実行されるイベントなので、フォームを開いた時点でテキストボックスに値を入れておきたい場合にぴったりです。
たとえば、次のコードをユーザーフォームのコード画面に書くと、フォームを開いたときに`TextBox1`に「住所を入力」と表示されます。
“`vb
Private Sub UserForm_Initialize()
TextBox1.Text = “住所を入力”
End Sub
“`
プロパティウィンドウから設定する方法もある
VBEでテキストボックスを選択して、プロパティウィンドウの`Text`や`Value`に文字を入力しておく方法もあります。
フォームを実行したときに、その文字が表示されるようになります。
ただし、`Date`や`Year(Date)`のような関数を使って今日の日付や年を表示したい場合、プロパティウィンドウに入力すると関数ではなく文字列として扱われてしまうことがあります。
そのため、日付・ログインユーザー名・セルの値など、実行するたびに変わる値を初期表示したい場合は、VBAコードで設定する方が安全です。
“`vb
Private Sub UserForm_Initialize()
TextBox1.Value = Year(Date) ‘ 今年の年
TextBox2.Value = Month(Date) ‘ 今月
TextBox3.Value = Day(Date) ‘ 今日
End Sub
“`
固定の文字ならプロパティウィンドウでも対応できますが、実務では`UserForm_Initialize`にまとめて書く方が管理しやすくなります。
フォーム上の入力欄が増えた場合でも、どのテキストボックスに何を初期表示しているかをコード上で一覧できるので、後から修正するときに迷いにくいからです。
2. セルの値をテキストボックスの初期値として表示する
セルの値を読み込んで表示する
ユーザーフォームは、単に文字を入力するだけでなく、Excelシート上のデータを編集する画面として使うことが多いです。
その場合、セルに入っている既存のデータをテキストボックスに初期表示して、ユーザーが必要に応じて修正してから保存する流れが自然です。
たとえば、セルA1の値を`TextBox1`に表示したい場合は、`UserForm_Initialize`イベントでセルの値を読み込ませます。
“`vb
Private Sub UserForm_Initialize()
TextBox1.Text = Worksheets(“Sheet1”).Range(“A1”).Value
End Sub
“`
よく見かける例では`ActiveSheet.Cells(1, 1)`を使うこともあります。
これは現在アクティブになっているシートのA1セルを指すので、簡単なサンプルでは分かりやすい書き方です。
ただし、実務では別のシートがアクティブになっている状態でフォームを開く可能性があります。
その場合、意図しないシートの値を読み込んでしまうことがあるので、できれば`Worksheets(“Sheet1”)`のように対象シートを明示する書き方がおすすめです。
コードが少し長くなっても、後から見たときに「どのシートのどのセルを使っているか」がはっきりします。
複数のテキストボックスに値を読み込む
複数のテキストボックスにセルの値を初期表示する場合も、考え方は同じです。
たとえば、A列に氏名、B列に住所、C列に電話番号が入っているような表で、2行目のデータをフォームに読み込むなら、次のように書けます。
“`vb
Private Sub UserForm_Initialize()
Dim targetRow As Long
targetRow = 2
TextBox1.Text = Worksheets(“Sheet1”).Cells(targetRow, 1).Value
TextBox2.Text = Worksheets(“Sheet1”).Cells(targetRow, 2).Value
TextBox3.Text = Worksheets(“Sheet1”).Cells(targetRow, 3).Value
End Sub
“`
行番号を変数にしておくと、選択した行のデータを編集するフォームにも応用しやすくなります。
テキストボックスの初期値をセルから取得する方法を覚えると、ユーザーフォームは「新規入力画面」だけでなく「既存データの編集画面」として使えるようになります。
特に、横に長い表や入力項目が多い表では、セルを直接編集するよりフォーム上で項目ごとに入力した方がミスを減らしやすくなります。
初期値を入れる目的は、入力の手間を省くだけではなく、ユーザーに「いま何を編集しているのか」を分かりやすく示すことにもあります。
3. テキストボックスの入力値を取得してセルに書き込む
入力値を取得する基本
テキストボックスに入力された値を取得するには、初期値を設定するときと同じように`TextBox1.Text`または`TextBox1.Value`を参照します。
一番よく使われるのは、ユーザーフォーム上に保存ボタンや登録ボタンを配置して、そのボタンがクリックされたタイミングで入力値を取得する方法です。
ボタンのクリックイベントに処理を書くことで、ユーザーが入力を終えた後にまとめてセルに書き込めます。
“`vb
Private Sub CommandButton1_Click()
Worksheets(“Sheet1”).Range(“A1”).Value = TextBox1.Text
End Sub
“`
入力値をメッセージボックスで確認したいだけなら、次のように書けます。
これは学習段階で、テキストボックスの値が正しく取得できているか確認するのに便利です。
“`vb
Private Sub CommandButton1_Click()
MsgBox TextBox1.Text
End Sub
“`
フォーム上で入力した内容が`MsgBox`に表示されれば、`TextBox1.Text`で値を取得できていることが分かります。
複数項目をセルに保存する
複数項目をセルに保存する場合は、初期値を読み込むときと逆の流れで、テキストボックスの値を各セルに代入します。
たとえば、氏名・住所・電話番号を入力するフォームなら、保存ボタンのクリックイベントで次のように書きます。
“`vb
Private Sub CommandButton1_Click()
Dim targetRow As Long
targetRow = 2
With Worksheets(“Sheet1”)
.Cells(targetRow, 1).Value = TextBox1.Text
.Cells(targetRow, 2).Value = TextBox2.Text
.Cells(targetRow, 3).Value = TextBox3.Text
End With
End Sub
“`
ここでも対象シートを明示しておくと、アクティブシートに左右されない安定したコードになります。
ボタン以外のタイミングで取得することもできる
ボタン以外のタイミングで入力値を取得することもできます。
たとえば、`TextBox1_Change`イベントを使うと、テキストボックスの内容が変更されるたびに処理が実行されます。
また、`KeyDown`イベントを使えば、Enterキーが押されたときだけセルに書き込む処理も可能です。
“`vb
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyReturn Then
Worksheets(“Sheet1”).Range(“A1”).Value = TextBox1.Text
End If
End Sub
“`
ただし、`Change`イベントは1文字入力するたびに動くので、入力途中の値までセルに反映されてしまいます。
通常の登録フォームでは、入力が完了してから保存ボタンで反映する方が分かりやすく、誤登録も防ぎやすいです。
数値や日付として扱う場合の注意点
テキストボックスから取得した値は、基本的には文字列として扱われます。
数値や日付としてセルに保存したい場合は、必要に応じて変換やチェックを行うと安心です。
たとえば、数量を入力するテキストボックスに文字が入っていると、後続の計算でエラーや意図しない結果につながることがあります。
入力値をそのまま保存するだけでなく、「空欄ではないか」「数値として扱えるか」「日付として正しいか」を確認する処理を入れると、実務向けのフォームになります。
4. ControlSourceや入力チェックを使って実務向けに仕上げる
ControlSourceプロパティという方法もある
テキストボックスとセルを連動させる方法として、`ControlSource`プロパティを使う方法もあります。
これは、テキストボックスのプロパティにセル番地を指定することで、そのセルの値をテキストボックスに表示し、入力内容をセルに反映できる機能です。
たとえば、`TextBox1`の`ControlSource`に`Sheet1!A1`や`A1`を設定すると、セルA1の値がテキストボックスに表示されます。
簡単なフォームであれば、VBAコードを書かずにセルと連動できる点が便利です。
ただし、`ControlSource`は手軽な反面、複雑な処理には向かない場合があります。
どのタイミングでセルに反映されるかが分かりにくかったり、入力チェックを挟みにくかったりするためです。
たとえば、入力値を保存する前に確認メッセージを出したい、空欄なら保存させたくない、複数セルに加工して書き込みたい、といった場合は、ボタンクリックイベントで明示的に保存処理を書く方が管理しやすくなります。
フォームを学び始めた段階では`ControlSource`で動きを確認して、実務用にはVBAで読み込みと保存を分ける設計にするとよいでしょう。
実務でよく使う形
実務でよく使う形は、次のような流れです。
1. フォームを開くときにセルから初期値を読み込む
2. ユーザーが修正する
3. 保存ボタンで入力チェックをしてセルに書き戻す
この形にしておくと、入力途中の内容が勝手にシートに反映されず、保存前にキャンセルすることもできます。
また、保存処理を1か所にまとめられるので、後から入力項目が増えた場合も修正しやすくなります。
“`vb
Private Sub UserForm_Initialize()
With Worksheets(“Sheet1”)
TextBox1.Text = .Range(“A1”).Value
End With
End Sub
Private Sub CommandButton1_Click()
If Trim(TextBox1.Text) = “” Then
MsgBox “入力値が空欄です。
内容を入力してください。
”
Exit Sub
End If
Worksheets(“Sheet1”).Range(“A1”).Value = TextBox1.Text
MsgBox “保存しました。
”
End Sub
“`
`Trim`は、文字列の前後にある余分な空白を取り除く関数です。
上の例では、空白だけが入力された場合も空欄として扱えるようにしています。
数値を扱う場合は`IsNumeric`、日付を扱う場合は`IsDate`を使うと、入力内容が目的の形式に合っているか確認できます。
テキストボックスは自由に文字を入力できる便利な部品ですが、その分、想定外の値が入る可能性もあります。
保存前に最低限のチェックを入れることで、後からシート上のデータを修正する手間を減らせます。
TextとValueの使い分けで迷ったら
最後に、TextプロパティとValueプロパティの使い分けで迷った場合は、まずどちらかに統一して書くことをおすすめします。
テキストボックスでは多くの場面でどちらでも動作しますが、記事やサンプルによって書き方が混在していると、初心者には違いが分かりにくくなります。
フォームの表示文字を扱う説明では`Text`、入力値として保存する説明では`Value`を使うなど、チームや自分の中でルールを決めておくと保守しやすくなります。
まとめ
Excel VBAのユーザーフォームでテキストボックスに初期値を入れる・入力値を取得する基本は、次のポイントを押さえれば十分に実用化できます。
– `UserForm_Initialize`で初期値を読み込む
– ボタンクリックで入力値を取得・保存する
– セルとの連携は対象シートを明示する
– 保存前に入力チェックを入れる
この記事の内容を参考に、使いやすいユーザーフォームを作ってみてください。
広告
