🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の TextBox — .Value が常に文字列である理由と、数値への変換方法

|

Excel VBA の TextBox — .Value が常に文字列である理由と、数値への変換方法

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