標準のプロパティ
VBAには
標準のプロパティ という概念があります。たとえば、セルを表すRangeオブジェクトにデータを代入する場合、正式には次のように記述します。
Sub Sample1()
Range("A1").Value = 123
End Sub
このように、セル(Rangeオブジェクト)に数値を入力するには、Rangeオブジェクトの
Valueプロパティ に数値を設定します。しかし、実際には次のようなコードでも、セルに数値を入力できます。
Sub Sample2()
Range("A1") = 123
End Sub
Rangeオブジェクトに対して数値123を設定していますが、はたしてこれでいいのでしょうか?だって、RangeオブジェクトにはFormulaプロパティやHorizontalAlignmentプロパティなど、Valueプロパティ以外にも多くのプロパティが用意されています。ただ「Range("A1") = 123」では、どのプロパティに数値を設定しているかが曖昧じゃないですか。
実はSample2でも、数値123は
Valueプロパティ に設定されます。VBAでは、
プロパティを省略 した場合、
標準のプロパティ が指定されたものと認識されます。標準のプロパティとは、そのオブジェクトの代表的なプロパティで、RangeオブジェクトではValueプロパティが標準のプロパティになります。
数年前に行った【VBA高速化テクニック】の検証では、この
標準のプロパティを省略しない方が高速 だという結果が出ました。当時の検証結果は次の通りです。
Test1 Test2 %
1回目 00:12 00:09 75.0%
2回目 00:11 00:09 81.8%
3回目 00:12 00:10 83.3%
4回目 00:11 00:09 81.8%
5回目 00:12 00:09 75.0%
6回目 00:11 00:09 81.8%
7回目 00:12 00:09 75.0%
8回目 00:11 00:09 81.8%
9回目 00:12 00:09 75.0%
10回目 00:11 00:10 90.9%
平均 00:11 00:09 80.0%
左の結果は、Cells(1,1)に値を代入する検証です。
Test1では、
Cells(1, 1) = j と書き、Test2では、
Cells(1, 1).Value = j と書きました。
結果はご覧の通り、標準のプロパティであるValueプロパティを省略せずに書くと約20%も高速化します。
しかし、今回あらためて検証を行った結果、高速化と言えるほどの差が出ないことがわかりました。実際に行った検証をご覧ください。最初は上と同じようにセルに数値を入力してみます。
Test1 Test2 %
1回目 03:59 04:04 102.1%
2回目 03:58 04:01 101.3%
3回目 03:58 03:58 100.0%
4回目 04:01 03:59 99.2%
5回目 03:58 03:58 100.0%
6回目 04:00 03:59 99.6%
7回目 03:58 03:59 100.4%
8回目 03:59 03:59 100.0%
9回目 03:59 04:00 100.4%
10回目 04:00 03:59 99.6%
平均 03:59 04:00 100.3%
Sub Test1()
Dim i As Long
For i = 1 To 10000
Range("A1") = i
Next i
End Sub
Sub Test2()
Dim i As Long
For i = 1 To 10000
Range("A1").Value = i
Next i
End Sub
平均を見ると、標準のプロパティであるValueプロパティを省略しない方がやや遅いようです。しかし、個々の所要時間では速い回もあり、結果として
差はない と判断してもいいと思います。
では、UserForm上ではどうでしょう。次の検証はUserFormに配置したTextBox1に文字を代入しています。TextBoxの標準のプロパティはTextプロパティです。
Test3 Test4 %
1回目 00:12 00:10 83.3%
2回目 00:10 00:10 100.0%
3回目 00:10 00:10 100.0%
4回目 00:10 00:10 100.0%
5回目 00:10 00:10 100.0%
6回目 00:11 00:10 90.9%
7回目 00:10 00:10 100.0%
8回目 00:10 00:10 100.0%
9回目 00:10 00:09 90.0%
10回目 00:10 00:10 100.0%
平均 00:10 00:10 96.1%
Private Sub CommandButton1_Click() 'Test3
Dim i As Long
For i = 1 To 200000
TextBox1 = i
Next i
End Sub
Private Sub CommandButton2_Click() 'Test4
Dim i As Long
For i = 1 To 200000
TextBox1.Text = i
Next i
End Sub
こちらも若干の差が出ましたが、とても"VBA高速化のポイント"とは言えません。
では
メソッド ではどうでしょう。標準のプロパティとは少し話が違いますが、メソッドの引数にも省略できるケースがあります。次の検証はセルの並べ替えを行う
Sortメソッド で行いました。Sortメソッドには多くの引数を指定できますが、省略することも認められています。引数を省略すると、現在の設定が指定されたものと認識します。セル範囲M1:M100に乱数を返すワークシート関数RAND()を入力し、そのセル範囲M1:M100を並べ替えます。Test5では全ての引数を指定しますが、Test6では省略してみます。
Test5 Test6 %
1回目 00:16 00:15 93.8%
2回目 00:17 00:15 88.2%
3回目 00:16 00:16 100.0%
4回目 00:17 00:15 88.2%
5回目 00:16 00:15 93.8%
6回目 00:16 00:15 93.8%
7回目 00:16 00:16 100.0%
8回目 00:17 00:15 88.2%
9回目 00:16 00:15 93.8%
10回目 00:16 00:15 93.8%
平均 00:16 00:15 93.3%
Sub Test5()
Dim i As Long
For i = 1 To 500
Range("M1:M100").Sort Key1:=Range("M1"), _
Order1:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
SortMethod :=xlPinYin, _
DataOption1:=xlSortNormal
Next i
End Sub
Sub Test6()
Dim i As Long
For i = 1 To 500
Range("M1:M100").Sort Key1:=Range("M1")
Next i
End Sub
なるほど、こちらは差が出たようです。う〜ん…しかし、メソッドの引数を省略するというのは、今回の主旨とは違うような気もします。まあ、これはこれで覚えておくとして、とりあえず今回は次のように結論を出しましょう。
標準のプロパティは、省略しても明記しても速度にほとんど差はない…かな。