TL;DR —
TextBoxが保存するものは一種類だけです:テキストです。TextBox1.Valueは、ユーザーが42や 日付を入力したときでも、常にStringを返します。それが、ほぼすべてのTextBoxのバグの元です — テキストへ の算術演算、あるいは数値と文字列の比較です。計算をする前にIsNumericで調べ、CDblやCLngで変換しまし ょう。テキストボックスでは.Textと.Valueはほぼ同じで、空のボックスは0ではなく""です。
Private Sub cmdAdd_Click()
' TextBox1.Value は文字列の "10" であって、数値の 10 ではない:
If IsNumeric(TextBox1.Value) Then
Dim n As Double
n = CDbl(TextBox1.Value) ' これで本物の数値になった
MsgBox n + 5
Else
MsgBox "Please enter a number"
End If
End Sub
TextBox は UserForm でいちばん素朴なコントロールです — ユーザーが打ち込むだけの箱です — それなのに、たった
一つの理由で最も多くの混乱を招きます。フォームの Controls コレクション を通して到達
する、コントロール一家の一員であり、どのコントロールとも同じようにプロパティを通して話しかけます。しかし
CheckBox が Boolean を返し、ListBox が選ばれた項目を返すの
に対して、TextBox は見かけによらず単純なもの — 文字列 — を返します。その文字列を、似ている数値だと思い込んで
扱うことこそが、TextBox の一番の間違いです。
この記事で学べること
- 見かけが何であれ、
TextBox1.Valueが常にStringである理由 .Valueに算術演算を行うと壊れる二通りの理由IsNumericで調べてからCDblやCLngで安全に変換する方法.Textと.Valueの小さな違い- 空のボックスが
0ではなく""である理由と、その調べ方 ChangeイベントとExitイベントで、ユーザーが入力する様子に反応する方法
考え方の軸:TextBox は常にテキストを返す
テキストボックスが保持しているのは文字だけで、それ以外の何ものでもありません。ユーザーが 42 と入力すると、
ボックスの中身は数値の 42 ではなく、二文字の文字列 "42" です。だから TextBox1.Value は String です — 見
かけがどうであれ、常にそうなのです。31/12/2026 と入力された日付は十文字の文字列ですし、通貨金額
1,250.00 はカンマの入った文字列です。VBA はテキストボックスから意図を読み取ってはくれません。文字を渡すだけ
で、意味づけはあなたに任されています。
この一つの事実が、TextBox にまつわるあらゆる驚きを説明します。ほかは忘れても、これだけは覚えておいてくださ
い:テキストボックスから出てくるものは、変換するまでずっとテキストです。
数値の罠:.Value への加算は二通りの壊れ方をする
.Value は文字列なので、それに対して計算をすることは、二つの失敗のどちらが出るかというコイン投げのようなも
のです。
' ボックスに 10 が入っているとする
MsgBox TextBox1.Value + 5 ' 15 にはならない
VBA が + を連結として扱えば "105" になりますし、ボックスの値が数値でなければ、代わりに実行時エラー 13、
Type mismatch になります。同じコードなのに、ユーザーが何を入力したかによって二通りの違う間違った結果になる
— まさに、あなたのテストは通るのに、ユーザーの手元では失敗する類のバグです。直し方は、.Value に対して直接算
術演算をしないことに尽きます。
安全に変換する:IsNumeric、それから CDbl か CLng
常にこの順番で、二段階です。まず IsNumeric でそのテキストが数値 である かを尋ね、そうとわかってから初めて
変換します。
If IsNumeric(TextBox1.Value) Then
Dim price As Double
price = CDbl(TextBox1.Value) ' 文字列 -> Double
Else
MsgBox "That is not a number"
TextBox1.SetFocus ' 直させるために戻す
End If
小数のあるもの(価格、料率)には CDbl を、整数(件数、ID)には CLng を使います。IsNumeric のガードを省
いて "abc" に CDbl を呼ぶと、同じ 実行時エラー 13 になります — ガードは気の利いたおまけではなく、クラッ
シュをメッセージに変える本体です。これは、値がテキストになった瞬間にあなたが手放した型安全性を、TextBox で
取り戻す方法なのです。
.Text と .Value の違い
テキストボックスでは、この二つはほとんど同じで、習慣として使うべきなのは .Value です。重要な違いはこうで
す:.Text は 常に ボックスに表示されている文字列そのものですが、.Value はより高機能なコントロールでは他
のプロパティの影響を受けることがあります。素の TextBox では、どちらも同じ文字列を返します。データを読むと
きは .Value を優先し、表示されている文字が特に必要なとき — たとえば .Value がまだ確定していない Change
イベントの中 — だけ .Text に手を伸ばしましょう。
空欄はゼロ文字の文字列であって、ゼロではない
空のテキストボックスは "" — ゼロ文字の文字列 — であって、0 でも Null でもありません。ですから、テキス
トとして調べましょう。
If Trim(TextBox1.Value) = "" Then
MsgBox "This field is required"
Exit Sub
End If
Trim は、ユーザーが空白だけを入力したボックスも捕まえてくれます。If TextBox1.Value = 0 と調べてはいけませ
ん — それは文字列と数値を比較していて、誤解を招きます。空欄は文字列なので、必須項目のチェックは数値のテストで
はなく文字列のテストです — InputBox から来た人がよくつまずく違いで、InputBox にはそ
れ自身のキャンセルと空欄の区別があります。
ユーザーの入力に反応する:Change イベントと Exit イベント
その場での検証のほとんどは、二つのイベントでカバーできます。Change はキーを押すたびに発火します — 文字数
をその場で数えたり OK ボタンを有効にしたりするのには向いていますが、重い処理には向いていません。Exit はユ
ーザーがボックスを離れるときに発火し、修正を強制するために キャンセル することができます。
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Not IsNumeric(TextBox1.Value) Then
MsgBox "Enter a number before moving on"
Cancel = True ' フォーカスをボックスに留める
End If
End Sub
Exit の中で Cancel = True を設定するのは、有効になるまでユーザーをそのフィールドに留めておく、きれいな方
法です — 不正な値がフォームの残りに流れ込んで後で失敗するよりずっとましです。安上がりなキー入力ごとのフィード
バックには Change を、本当の検証には Exit を使いましょう。
ExcelMaster の活用
TextBox のバグは、まさに「私の環境では動く」の見本です。テストでは常に数値が入っていたボックスが、本番では
迷い込んだ一文字を抱え、+ 5 は "105" かエラー 13 になります。それを壊す入力がやってくるまで、静かに潜んで
いるのです。
ExcelMaster には、そのフィールドが何を意
味するかを伝えるだけで構いません — 「これは価格で、数値でないものは拒否してカーソルを戻して」 — すると
IsNumeric のガードと CDbl の変換を書き、Exit イベントまで配線してくれるので、文字列から数値への変換が抜
け落ちることはありません。フォームとコードはあなたの手元に残ります。
よくある質問
VBA の TextBox の値は常に文字列ですか?
はい。TextBox は文字を保存するので、ユーザーが数字や日付を入力しても TextBox1.Value は常に String を返
します。VBA が代わりに変換してくれることはありません。数値として使うには、IsNumeric で本当に数値かを確かめ
たあと、CDbl や CLng で自分で変換する必要があります。
VBA の TextBox から数値を取得するには?
まずガードし、それから変換します。IsNumeric(TextBox1.Value) を調べ、通ったら小数には
CDbl(TextBox1.Value) を、整数には CLng(TextBox1.Value) を呼びます。数値でないテキストに CDbl を呼ぶと
実行時エラー 13 になるので、IsNumeric の確認が、クラッシュを親切なメッセージに変えてくれます。
TextBox の .Text と .Value の違いは何ですか?
素の TextBox ではどちらも同じ文字列を返し、データを読むときの慣習的な選択は .Value です。.Text は常に
今表示されている文字で、.Value はより高機能なコントロールでは異なることがあります。基本は .Value を使い、
Change イベントの中のように、表示されている文字列が特に必要なときだけ .Text を使いましょう。
VBA で TextBox が空かどうかを調べるには?
テキストとして調べます:If Trim(TextBox1.Value) = "" Then。空のボックスはゼロ文字の文字列であって 0 や
Null ではなく、Trim は空白だけが入ったボックスも捕まえてくれます。0 と比較してはいけません。文字列と数
値を混ぜてしまい、誤解を招く結果になります。
ユーザーの入力中に TextBox を検証するには?
安上がりなキー入力ごとのフィードバック(文字数、ボタンの有効化)には Change イベントを、本当の検証には
Exit イベントを使います。Exit では、その Cancel 引数を True に設定して、入力が有効になるまでカーソル
をボックスに留めましょう。そうすれば、不正な値がフォームの残りに届くことはありません。
検証環境
検証環境: Excel 365 (Windows 11)、VBA 7.1 — 最終確認 2026-09-28。
関連ガイド: VBA Controls · VBA Frame · VBA UserForm · VBA InputBox · VBA ComboBox · VBA CheckBox · VBA On Error
