トップページ >
Excel >
VBA >
高速化テクニック >
標準のプロパティ
標準のプロパティ
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
なるほど、こちらは差が出たようです。う〜ん…しかし、メソッドの引数を省略するというのは、今回の主旨とは違うような気もします。まあ、これはこれで覚えておくとして、とりあえず今回は次のように結論を出しましょう。
標準のプロパティは、省略しても明記しても速度にほとんど差はない…かな。
[名前で呼ぶな!]戻る← | →進む[関数も使え!]