With ステートメントを使ってマクロの実行速度を高速化する


コメントにて以下のようなご質問をいただきました。


Outlook(2003)からエクセル(2003)に連絡先を取得するマクロを作成しています。
一応動くのですが、1件出力するのに3.4秒かかってしまいます。
私の場合500件あり28分掛かります。もっと件数が多い場合も想定するとちょっと処理が遅すぎて使えない状況です。

—— 中略
For i = 1 To FLRC
    Cells(r, 1).Value = Mid(myFolder.Items(i).Department, 1, 3)
    Cells(r, 2).Value = myFolder.Items(i).LastName & myFolder.Items(i).FirstName
    Cells(r, 3).Value = myFolder.Items(i).Email1Address
    Cells(r, 4).Value = myFolder.Items(i).Account
NEXT i

——
この書込み時に遅いのですが、もっと早く処理できる方法はあるのでしょうか? それとも別のOSでのやりとりはこんなものなのでしょうか。


このご質問に対する答えが、タイトルにもある With ステートメントを使うというものです。
具体的には以下のようにします。

For i = 1 To FLRC
    With myFolder.Items(i)
        Cells(r, 1).Value = Mid(.Department, 1, 3)
        Cells(r, 2).Value = .LastName & .FirstName
        Cells(r, 3).Value = .Email1Address
        Cells(r, 4).Value = .Account
    End With
NEXT i

With ステートメントとは、コード中で頻繁に使用されるオブジェクトを宣言し、With ブロック中でそのオブジェクトの表記を省略できるようにするというものです。
たとえば、上記の例では繰り返し使われていた myFolder.Items(i) というオブジェクトを With で定義し、それ以降 myFolder.Items(i) を省略しています。(. で始まるプロパティやメソッドは With で定義されたオブジェクトのものと認識されます。)

このようにすると、単に入力する文字数が少なくて済むというだけでなく、高速化も図れるのです。
では、なぜこれで高速化するのでしょうか?
その理由を知るには、まず myFolders.Items(i).Department とした場合に、内部でどのような動作が発生するかを知る必要があります。

myFolders.Items(i).Department という記述をした場合、VBA の内部では以下のような処理が行われます。

  1. myFolders から Items プロパティを取得
  2. Items プロパティの Item プロパティで i を指定してアイテムを取得
  3. 取得したアイテムの Department プロパティを取得

そして、このような記述を繰り返した場合、上記の 1-3 が繰り返されることになります。
しかし、1. と 2. については繰り返す必要がなく、一度取得したアイテムについて 3. だけを実行すればよいものです。

With ステートメントを使うと、上記の 1. と 2. は 1 度だけ実行され、それ以降の . で始まるプロパティやメソッドでは上記の 3. の処理だけが行われるということになります。
そのため、処理の高速化が図れるのです。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中