Excelのセルには「値(Value)」「見た目(Text)」「書式(NumberFormat)」の3層があります。VBAで意図しない動作が起きるとき、多くはこの違いを混同していることが原因です。特に日付・金額・パーセントの扱いでよく問題になります。
この記事では、次の内容を順番に解説します。
- Value・Text・NumberFormatの違い
- 日付・金額・パーセントでよくあるトラブルと対策
- Value2とValueの違い
- セルをコピーするときの書式の扱い方
Value・Text・NumberFormatの違いを理解するには?
Excelのセルには、見た目上は同じに見えても、内部的に異なる3つの要素が存在します。
| プロパティ | 内容 | 用途 |
|---|---|---|
Value | セルに格納されている実際の値 | 計算・比較・代入 |
Text | 画面上に表示されている文字列(書式適用後) | 表示内容の確認・文字列として出力 |
NumberFormat | 表示書式の設定文字列 | 書式の確認・設定 |
' A1セルに日付「2025/7/30」が表示されている場合
Debug.Print Range("A1").Value ' → 45103(日付シリアル値)
Debug.Print Range("A1").Text ' → "2025/07/30"(表示されている文字列)
Debug.Print Range("A1").NumberFormat ' → "yyyy/mm/dd"(書式設定)
画面上では「2025/07/30」と見えていても、Value で取得すると 45103 という数値が返ってきます。これが多くの混乱の原因です。
日付の比較でよくあるトラブルを直すには?
日付が入ったセルを文字列と比較すると、正しく判定できません。
' うまくいかない例(ValueはシリアルなのにTextで比較している)
If Range("A1").Value = "2025/7/30" Then
MsgBox "一致" ' ← 一致しないことが多い
End If
' 正しい書き方①:DateSerial で日付型に変換して比較
If Range("A1").Value = DateSerial(2025, 7, 30) Then
MsgBox "一致"
End If
' 正しい書き方②:CDate で変換して比較
If Range("A1").Value = CDate("2025/7/30") Then
MsgBox "一致"
End If
今日の日付と比較する場合:
If Range("A1").Value = Date Then
MsgBox "今日の日付です"
End If
金額・パーセントでよくあるトラブルを直すには?
「1,234」と表示されているセルの値を取得すると、Value は 1234(カンマなし)です。また「50%」と表示されているセルの Value は 0.5 です。
' 金額セル(表示:"1,234")のValue
Debug.Print Range("A1").Value ' → 1234(数値)
Debug.Print Range("A1").Text ' → "1,234"(表示文字列)
' パーセントセル(表示:"50%")のValue
Debug.Print Range("A1").Value ' → 0.5(数値)
Debug.Print Range("A1").Text ' → "50%"(表示文字列)
これを知らずに Text で比較すると、文字列と数値のミスマッチが起きます。
' よくある間違い
If Range("A1").Text = "50%" Then ' TextはStringなので文字列比較になる
MsgBox "50%です"
End If
' 正しい書き方(Valueで数値として比較)
If Range("A1").Value = 0.5 Then
MsgBox "50%です"
End If
Value2とValueの違いを理解するには?
Value2 は Value と似ていますが、日付や通貨を「そのままの数値」として返す点が異なります。
' A1セルに日付「2025/7/30」が入っている場合
Debug.Print Range("A1").Value ' → 2025/07/30(Date型として返る)
Debug.Print Range("A1").Value2 ' → 45103(シリアル値の数値として返る)
Value は日付型(Date型)として返すため、そのまま計算に使えます。Value2 は純粋な数値として返すため、大量データの処理では Value2 の方が高速になるケースがあります。通常の用途では Value を使えば問題ありません。
コピー時に書式を正しく扱うには?
セルをコピーするとき、何をコピーするかによって結果が変わります。
' パターン①:値だけコピー(書式は引き継がない)
Range("B1").Value = Range("A1").Value
' パターン②:表示文字列をコピー(TextはStringなので書式なし)
Range("B1").Value = Range("A1").Text
' パターン③:値と書式を丸ごとコピー(Copyメソッド)
Range("A1").Copy Destination:=Range("B1")
' パターン④:値のみ貼り付け(書式は引き継がず、数式を値に変換)
Range("A1").Copy
Range("B1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
使い分けの目安:
- 数値・文字列をそのまま別セルに移したい →
.Value = .Value - 書式も含めてまるごとコピーしたい →
Copy Destination - 数式を値に変換してコピーしたい →
PasteSpecial xlPasteValues - 表示されている文字列として別セルに入れたい →
.Value = .Text
NumberFormatを設定するには?
VBAで書式を設定・変更するには NumberFormat プロパティに書式文字列を代入します。
' 日付書式を設定
Range("A1").NumberFormat = "yyyy/mm/dd"
' カンマ区切りの数値書式を設定
Range("B1").NumberFormat = "#,##0"
' パーセント表示(小数1桁)
Range("C1").NumberFormat = "0.0%"
' 書式をクリア(標準に戻す)
Range("A1").NumberFormat = "General"
まとめ
- Value:計算・比較に使う実際の値。日付はシリアル値・パーセントは小数で返る。
- Text:画面表示用の文字列。比較や計算には使わない。
- NumberFormat:表示書式の設定。VBAから変更・確認できる。
- 日付の比較:文字列ではなく
DateSerialやDateを使う。 - コピー時:値だけなら
.Value = .Value、書式ごとならCopy Destination、値のみ貼り付けならPasteSpecial。
よくある質問
ValueとTextのどちらを使えばいいですか?
計算・比較・代入には Value を使います。Text は「画面に表示されている文字列として出力したい」場合だけ使います。ほとんどの処理では Value で事足ります。
日付セルをValue で取得すると数値が返ってきます。これは正常ですか?
正常です。Excelは日付を「1900年1月1日を1として数えた日数(シリアル値)」として管理しています。VBAでは Value の返り値が Date 型として扱われることが多いですが、Variant 型の変数に入れると数値になることがあります。Dim d As Date で宣言した変数に代入すれば日付型として扱えます。
セルの書式設定を確認する方法はありますか?
Range("A1").NumberFormat で確認できます。イミディエイトウィンドウで ? Range("A1").NumberFormat と入力して実行すると、その場で確認できます。
Textプロパティが「######」を返すことがあります。なぜですか?
列幅が狭くてセルに値が表示しきれない場合、Excelは「######」を表示します。Text プロパティはその表示文字列をそのまま返すため、「######」が返ってきます。列幅を広げるか、Value を使うことで回避できます。
数式が入ったセルのValueを取得すると何が返りますか?
数式の計算結果が返ります。例えば =SUM(A1:A10) が入ったセルの Value は、合計値の数値です。数式文字列(=SUM(A1:A10)という文字列)を取得したい場合は Formula プロパティを使います。
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



