いまさらRangeオブジェクト: Value、Text、メンバー指定なし
RangeオブジェクトのディフォルトのプロパティはValueです。Textではありません。この2つのプロパティの違いはちゃんと理解しておいた方がよいです。
Dim xCell As Excel.Range Set xCell = Sheet1.Range("A1") xCell = Now xCell.NumberFormatLocal = "[$-ja-JP-x-gannen]ggge""年""m""月""d""日"";@" Debug.Print xCell Debug.Print xCell.Value Debug.Print xCell.Tex
実行結果:
2019/12/11 13:42:18
2019/12/11 13:42:18
令和元年12月11日
xCellには今日の日付をセットして、表示形式を和暦にしてあります。xCellとxCell.Valueは西暦を返していますが、xCell.Textは令和になっています。つまり、Textは書式付きの値を返します。あと、Textは読み取り専用です。
普通に考えて.Valueよりも.Textの方が時間がかかるだろうと予想できますが、どのくらい違うのか計測してみました。
Value指定 Private Sub test1() Dim xCell As Excel.Range Dim i As Long Dim buff As String Set xCell = Sheet1.Range("A10") StartTimer For i = 1 To 10000 buff = xCell.Offset(0, 1).Value Next Debug.Print "Test1: " & ElapsedTime End Sub
Textプロパティ Private Sub test2() Dim xCell As Excel.Range Dim i As Long Dim buff As String Set xCell = Sheet1.Range("A10") StartTimer For i = 1 To 10000 buff = xCell.Offset(0, 1).Text Next Debug.Print "Test2: " & ElapsedTime End Sub
プロパティ指定なしと.Value指定の違いはほとんどありませんが、.Value指定の方が誤差の範囲程度で早いです。気になるtest1とtest2の結果ですが、test2はtest1の4倍時間がかかるという結果が出ました。
結論
.Textはセルに表示されている形式で返してきます。ここで問題になるのはDate/TimeとNumberです。この2つのデータタイプはセル幅が狭くなると、"#"と表示されてしまいます。
Time | Number | String |
11:30 | 9,999,999,999 | This is a test |
11:35 | ||
11:40 | ||
11:50 | ||
11:55 |
セル幅を狭くすると、このようになります。
Time | Number | String |
## | ##### | This is a test |
## | ||
## | ||
## | ||
## |
? Sheet1.Range("A5").Text
#
? Sheet1.Range("B5").Text
#
? Sheet1.Range("C5").Text
This is a test
.Textプロパティにこんな実行時エラーがあるとはプロ泣かせです。