ValueとValue2
セルの値を取得・設定する際、多くの人が .Value を何も考えずに使っていると思います。しかし.Valueは値の変換処理が行われておりその分時間が掛かります。
しかし.Value2 はシリアル値をそのまま返すため変換処理がない分高速です。
では、.Valueをやめて、.Value2を使うようにした方がよいのでしょうか?
この記事では .Value と .Value2 の違い、そして .Value と .Value2 のどちらを使うべきなのかを説明します。
なお、他のプロパティについて「セルのValueとValue2とTextとFormulaとFormula2の違い」で解説していますので興味があればご覧ください。
.Value と .Value2 の違いとは?
Valueプロパティはデータ型をVBAに合わせて変換します。例えば、日付はDate型で返されます。また、Sum関数などの数値を求める数式があればその計算結果をさらにVBAのデータ型に合わせて変換して返します。
Value2プロパティはExcelのシリアル値と呼ばれる生データをそのまま返します。
Valueは「変換して返す」、Value2は「変換せずに返す」という違いです。変換して返す分、ValueはValue2より遅いです。
日付のサンプル
Excelのセル A1 に 2025/6/16 と入力されているとします。これをTypeName関数を通してデータ型を取得してみます。
1 2 3 4 5 6 7 8 9 |
Sub CheckValueTypes() '// A1セルのValue Debug.Print TypeName(Range("A1").Value) '// "Date" が返される Debug.Print Range("A1").Value '// "2025/06/16" が返される '// A1セルのValue2 Debug.Print TypeName(Range("A1").Value2) '// "Double" が返される Debug.Print Range("A1").Value2 '// "45824" が返される End Sub |
実行結果
Date
2025/06/16
Double
45824
つまり、.Value は「Excelの日付」を自動的に Date 型に変換してくれますが、.Value2 は内部で管理されている「シリアル値(Double型)」のまま返します。
なお、2025/6/16のシリアル値が45824です。
変換しないので.Value2の方が高速。でもそんなに差がない
.Valueは変換を行う分の処理時間が必要ですが、.Value2は変換処理がないためその分高速です。
ではどの程度の差があるのか計測してみます。
計測には「Ryzen9 3900X(2019年発売)」というCPUを使っています。12コア24スレッドで当時は超高速ではありましたが2025年現在からすると6年前のCPUになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub TestValueSpeed() Dim t As Double, i As Long, v '// Valueを計測 t = Timer For i = 1 To 1000000 v = Cells(i, 1).Value Next Debug.Print "Value : " & Format(Timer - t, "0.000") & " 秒" '// Value2を計測 t = Timer For i = 1 To 1000000 v = Cells(i, 1).Value2 Next Debug.Print "Value2: " & Format(Timer - t, "0.000") & " 秒" End Sub |
実行結果
Value : 2.901 秒
Value2: 2.785 秒
現在2025年で、6年前発売のこのCPUでも100万回の処理で0.1秒ほどの差しかありません。
2010年ごろに主流だったコア数が2つとかのIntel Core i5/i3のCPUの場合であれば、「高速に処理したいなら.Value2を使う方がよい」と言えたのですが、Windows10以降で扱うCPUであれば、速度的にも.Valueでも全然OKです。
.Value2を使う理由は?
最近のExcelでは「型変換の有無」が全く速度差にならず .Value も .Value2 もほぼ同等の速度です。
少なくとも速度目的だけで .Value2 を使う必要はありません。
それでも.Value2を使う理由があるとすれば、シリアル値で取得したい場合になります。主に日付をシリアル値で扱いたい場合が多いと思われます。
ただ、日付を扱う場合もほとんどの場合は.ValueでOKのため、通常使う場合は.Valueで問題ないです。