The Value property is the main gateway to read or write the actual contents of Excel cells (numbers, text, dates, blanks, or errors), and it becomes especially powerful when you process ranges as arrays for speed and safety.
ExcelのセルをVBAで触るとき、いちばん基本になるのが Value です。ざっくり言うと、Value は「セルの見た目」ではなく「セルに入っている中身そのもの」を読み取ったり、書き換えたりするための入口です。まずはここを押さえるだけで、セル操作が一気に分かりやすくなります。
Range("A1").Value で、A1セルに入っている値(数値・文字・日付など)を、そのまま取り出せます。見た目が「1,000円」でも、Value としては 1000 のような実データを扱う場面が多いです。Range("A1").Value = 10 のように代入すると、セルの中身を更新できます。文字列、数値、日付など、渡した値の型によってセルに入るものが変わります。Value で読むと「2次元配列」になり、これがVBA高速化の王道ルートになります(セルを1個ずつ触る回数が激減します)。1セルを読む
VBA
Sub ReadValueSample()
Dim v As Variant
v = Range("A1").Value
MsgBox v
End Sub
1セルへ書く
VBA
Sub WriteValueSample()
Range("A1").Value = "Hello"
Range("A2").Value = 123
Range("A3").Value = Date
End Sub
初心者のうちは、「Value はセルの中身」「読むときは右側、書くときは左側」だけ覚えておけばOKです。
Excelは表示形式で、数値を「1,000」や「1,000円」のように見せたり、日付を「2026/01/14」のように整えたりします。でも、VBAで判断・計算したいときに大事なのは、だいたい “見た目” ではなく “中身” です。
Value は「実データ寄り」Text は「画面に見えている文字列」##### になった表示そのものが返ることもあります。見た目が欲しい場面で使いますが、判定の基準にすると事故りやすいので注意です。「表示どおりに見せたい」用途なら Text が便利なこともありますが、「正しく処理したい」用途では Value を基準にする方が安定します。
見た目が似ているのに、意味が違うものが3つあります。
"")VBA
Sub EmptyCheckSample()
Dim v As Variant
v = Range("A1").Value
If IsError(v) Then
Debug.Print "セルがエラー値です"
Exit Sub
End If
If IsEmpty(v) Then
Debug.Print "完全に空(未入力)"
ElseIf v = "" Then
Debug.Print "空文字("""" が入っている/数式結果など)"
ElseIf v = 0 Then
Debug.Print "0"
Else
Debug.Print "その他:" & v
End If
End Sub
実務では「何を空扱いにしたいか(未入力だけ?空文字も?)」を先に決め、そのルールに合わせた判定に寄せると、後から崩れにくいです。
セルが #N/A や #VALUE! のようなエラーのとき、Value には“エラーを表す値”が入ります。その状態で文字列化や数値化をすると、型不一致などで落ちやすいです。
VBA
Sub ErrorValueSample()
Dim v As Variant
v = Range("A1").Value
If IsError(v) Then
Debug.Print "セルがエラーです(変換や計算の前に弾く)"
Exit Sub
End If
Debug.Print v
End Sub
「IsError で先に弾く」は、Value周りの事故を減らす基本技です。
1セルなら単体、複数セル(範囲)なら配列。ここを理解すると “VBAが遅い問題” を一気に解決しやすくなります。
VBA
Sub RangeValueToArraySample()
Dim arr As Variant
Dim r As Long, c As Long
arr = Range("A1:C3").Value
For r = LBound(arr, 1) To UBound(arr, 1)
For c = LBound(arr, 2) To UBound(arr, 2)
Debug.Print r, c, arr(r, c)
Next c
Next r
End Sub
セルを1個ずつ読む/書くのではなく、範囲を配列で一括処理してからまとめて書き戻すと、体感で桁違いに速くなります。
VBA
Sub BulkProcessTemplate()
Dim rng As Range
Dim arr As Variant
Dim r As Long
Set rng = Range("A1:A100")
arr = rng.Value
For r = 1 To UBound(arr, 1)
If Not IsError(arr(r, 1)) Then
If Len(arr(r, 1) & "") > 0 Then
arr(r, 1) = arr(r, 1) & "!"
End If
End If
Next r
rng.Value = arr
End Sub
この形は「大量データを扱う」「処理時間を短くしたい」場面で、とても強い土台になります。
Value と似たものに Value2 があります。迷ったら Value でOKですが、目的によっては Value2 が扱いやすいことがあります。
ValueValue2 を検討Value2 が都合の良いことがあります。VBA
Sub Value2Sample()
Dim v1 As Variant
Dim v2 As Variant
v1 = Range("A1").Value
v2 = Range("A1").Value2
Debug.Print "Value : "; v1
Debug.Print "Value2: "; v2
End Sub
どちらが正しいか、ではなく「何をしたいか」で選ぶのが現場向きです。
Range("A1") = 10 と Range("A1").Value = 10 は同じですか?Value のため)。ただ、学習ページや保守を意識するなら .Value を明示した方が意図が伝わりやすいです。Value はいつも数値を返しますか?Variant にしておくのが安全です。Text が候補になります。ただし表示形式やセル幅に強く依存します。「正しく処理したい」ならまず Value を基準に考えるのがおすすめです。Value で読んだら配列になって混乱しましたValue は 2次元配列になります。LBound/UBound を使って安全に回すと、事故が減ります。IsEmpty や Len、IsError を組み合わせるのが実務的です。IsError で弾いてから扱います。Value が配列になっているのに、添字を決め打ちしている可能性があります。LBound/UBound を使って範囲内を回します。"" の可能性があります。未入力だけを空扱いにするのか、空文字も空扱いにするのか、ルールを決めて判定を揃えます。