機能と数式 | VBA | セミナー | オンラインソフト | お問い合わせ | その他
Top > Excel > VBA > 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高速化テクニック】の検証では、この標準のプロパティを省略しない方が高速だという結果が出ました。当時の検証結果は次の通りです。

 Test1Test2%
1回目00:1200:0975.0%
2回目00:1100:0981.8%
3回目00:1200:1083.3%
4回目00:1100:0981.8%
5回目00:1200:0975.0%
6回目00:1100:0981.8%
7回目00:1200:0975.0%
8回目00:1100:0981.8%
9回目00:1200:0975.0%
10回目00:1100:1090.9%
平均00:1100:0980.0%
左の結果は、Cells(1,1)に値を代入する検証です。
Test1では、Cells(1, 1) = j と書き、Test2では、Cells(1, 1).Value = j と書きました。
結果はご覧の通り、標準のプロパティであるValueプロパティを省略せずに書くと約20%も高速化します。

しかし、今回あらためて検証を行った結果、高速化と言えるほどの差が出ないことがわかりました。実際に行った検証をご覧ください。最初は上と同じようにセルに数値を入力してみます。

 Test1Test2%
1回目03:5904:04102.1%
2回目03:5804:01101.3%
3回目03:5803:58100.0%
4回目04:0103:5999.2%
5回目03:5803:58100.0%
6回目04:0003:5999.6%
7回目03:5803:59100.4%
8回目03:5903:59100.0%
9回目03:5904:00100.4%
10回目04:0003:5999.6%
平均03:5904:00100.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プロパティです。

 Test3Test4%
1回目00:1200:1083.3%
2回目00:1000:10100.0%
3回目00:1000:10100.0%
4回目00:1000:10100.0%
5回目00:1000:10100.0%
6回目00:1100:1090.9%
7回目00:1000:10100.0%
8回目00:1000:10100.0%
9回目00:1000:0990.0%
10回目00:1000:10100.0%
平均00:1000:1096.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では省略してみます。

 Test5Test6%
1回目00:1600:1593.8%
2回目00:1700:1588.2%
3回目00:1600:16100.0%
4回目00:1700:1588.2%
5回目00:1600:1593.8%
6回目00:1600:1593.8%
7回目00:1600:16100.0%
8回目00:1700:1588.2%
9回目00:1600:1593.8%
10回目00:1600:1593.8%
平均00:1600:1593.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

なるほど、こちらは差が出たようです。う〜ん…しかし、メソッドの引数を省略するというのは、今回の主旨とは違うような気もします。まあ、これはこれで覚えておくとして、とりあえず今回は次のように結論を出しましょう。

標準のプロパティは、省略しても明記しても速度にほとんど差はない…かな。



このエントリーをはてなブックマークに追加