wrote :: 2005.01.18

トップページ > Excel > VBA > 高速化テクニック > 余計なことはするな!


余計なことはするな!

マクロでは、よくセルの書式を設定します。ところが、セルの書式はオブジェクトの構造が複雑で多くのプロパティが存在します。自分のやりたい動作に、どのプロパティやメソッドを使うか……迷ったときはとにかくマクロ記録しましょう。
次のコードは、セルの文字列を太字にする操作をマクロ記録したものです。

Sub Macro1()
    With Selection.Font
        .Name = "MS Pゴシック"
        .FontStyle = "太字"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlNone
        .ColorIndex = xlAutomatic
    End With
End Sub

なんか、訳の分からないコードがいっぱい並んでますけど、とにかくこのコードを実行すればセルの文字列が太字になるのです。自作のマクロにこのコードを挿入して完成です。出来た出来たと…。

マクロの実行速度を全く気にしない方なら、そのままExcelを終了してもけっこうです。しかし、少しでも速いマクロを作りたいとか、できるだけ美しいコードを書きたいと思うのでしたら、もう一度挿入したコードを見直しましょう。

 Test1Test2%
1回目00:3100:039.7%
2回目00:3200:039.4%
3回目00:3100:039.7%
4回目00:3100:039.7%
5回目00:3100:039.7%
6回目00:3100:039.7%
7回目00:3000:0310.0%
8回目00:3100:039.7%
9回目00:3000:0310.0%
10回目00:3000:0310.0%
平均00:3100:03 9.7%
Test1では、マクロ記録で生成されたコードをそのまま実行しました。Test2では「Font.FontStyle = "太字"」の1行です。セルの文字列を太字にするには、この1行だけで十分なのです。

今回は実験ですから、セル範囲A1:A10に対して同じ操作を100回繰り返しました。

Sub Test1()
    Dim i As Integer, j As Integer
    For i = 1 To 100
        For j = 1 To 10
            With Cells(j, 1).Font
                .Name = "MS Pゴシック"
                .FontStyle = "太字"
                .Size = 11
                .Strikethrough = False
                .Superscript = False
                .Subscript = False
                .OutlineFont = False
                .Shadow = False
                .Underline = xlNone
                .ColorIndex = xlAutomatic
            End With
        Next j
    Next i
End Sub

Sub Test2()
    Dim i As Integer, j As Integer
    For i = 1 To 100
        For j = 1 To 10
            Cells(j, 1).Font.FontStyle = "太字"
        Next j
    Next i
End Sub

結果は一目瞭然。9割程度の高速化が認められました。

よく見ると、Test1のWithステートメント内は全部で10種類のプロパティを設定しています。これを1種類のみに変更したのですから、設定したプロパティの数だけを見ると1/10です。所要時間が約1/10〜2/10に減少したのと一致しています。

実は、VBAではプロパティの設定や参照は時間のかかる処理のひとつなのです。ましてや、表示形式を太字に変えるだけなのに、フォントの種類からサイズ・下線の有無・色など、関係ない設定をしているのですから、遅いはずです。

マクロ記録は、コーディングの手間を省く実に頼もしい機能です。しかし必ずしも効率的なコードを生成してくれるとは限りません。もしあなたが「見栄え」と「高速化」を気にするのでしたら、マクロ記録でどんなコードが生成されたのか。そして、そのコードは自分のやりたい動作に必要なのか確認する習慣をつけましょう。そうしてマクロ記録のコードをヘルプなどで調べるうちに、気がつくとマクロのベテランになっているのです。ウソではありません(^_^)


マクロ記録は、自分の望む動作に不要なコードも生成するので注意が必要です。またマクロ記録は、同じ結果でも実行したメニューやコマンドによって記録されるコードが異なります。いくつか例をご紹介しましょう。

まず、今回のサンプルで登場した「セルの文字を太字にする」動作です。前述のMacro1は[セルの書式設定]ダイアログボックスの[フォント]タブで操作したのですが、これを[書式設定]ツールバーの[太字]ボタンをクリックすると次のようになります。

Sub Macro2()
    Selection.Font.Bold = True
End Sub

こちらの方がシンプルで分かりやすいですね。しかし、よく見ると記録されたプロパティが微妙に違っています。Macro1ではFontオブジェクトFontStyleプロパティに"太字"という文字列を設定しています。対してボタンで操作したMacro2では、FontオブジェクトBoldプロパティにTrueを設定しています。結果はどちらも同じです。どちらがいい…とかの問題ではありません。大切なのは、2通りのやり方があると知ることです。

もうひとつ。列を削除する操作を記録してみましょう。最初は、列番号を右クリックして表示されるショートカットメニューから[削除]を実行します。

Sub Macro3()
    Columns("C:C").Select
    Selection.Delete Shift:=xlToLeft
End Sub

同じ結果を別の操作でやってみましょう。今度はアクティブセルをセルC1にしておき、[編集]メニューの[削除]を実行し、表示される[削除]ダイアログボックスで[列全体]を選択して[OK]ボタンをクリックしてみます。

Sub Macro4()
    Selection.EntireColumn.Delete
End Sub

SelectionはセルC1のことです。Macro4では、特定のセルを含む列を返すEntireColumnプロパティが記録されています。さらに、Macro4では列を選択(Select)していない点に留意してください。

マクロ記録は便利で欠かせない機能です。ただし、使いこなすにはExcelの知識が必須です。マクロを上達したいのでしたら、まずExcelの機能を完全に理解することも重要です。


[Selectするな!]戻る← | →進む[何度も同じこと言わせるな!]