VBA-Application.VLookupでもWorksheetsオブジェクトはSetした方が速い

2016/10/01

プログラム

t f B! P L
■■■エクセルVBAマクロの話■■■
一般的にWorksheetsオブジェクトはSetした方が速いと言われている。
Application.VLookupとかの関数内でもそうか検証してみた。

■Setしてないやつ
====================
Dim i As Long
Dim MR As Long

MR = Cells(Rows.Count, 2).End(xlUp).Row '最終行,B:B
    For i = 2 To MR
        Cells(i, 1) = Application.VLookup(Cells(i, 8), Worksheets("キレたK").Range("A:Q"), 2, False)
        Cells(i, 2) = Application.VLookup(Cells(i, 8), Worksheets("キレたK").Range("A:Q"), 7, False)
    Next i
====================

■Setしたやつ
====================
Dim i As Long
Dim MR As Long
Dim ws1 As Worksheet
Set ws1 = Worksheets("キレたK")

MR = Cells(Rows.Count, 2).End(xlUp).Row '最終行,B:B
    For i = 2 To MR
        Cells(i, 1) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 2, False)
        Cells(i, 2) = Application.VLookup(Cells(i, 8), ws1.Range("A:Q"), 7, False)
    Next i
====================

■結果
Setしてないやつ
1回目 39秒
2回目 39秒

Setしたやつ
1回目 37秒
2回目 37秒

■結論
やはりSetしたほうが速い。
一般的にそういわれているが常識を疑ってみた。
2秒だが、また、世界を縮めてしまった……。
_(:3 」∠)_

いや、なんでこんな検証をしたのかというと
WORKDAY(開始日, 日数, [祝日])の祝日に配列定数を指定できると聞いて

====================
    SYUKU = ws1.Range("A1:A4").Value
        VV(i, 1) = WorksheetFunction.WorkDay(Cells(i, 6), -1 * Cells(i, 5).Value + 5, SYUKU)
==================== 

みたいにしたらなんか遅い。

====================
        VV(i, 1) = WorksheetFunction.WorkDay(Cells(i, 6), -1 * Cells(i, 5).Value + 5, ws1.Range("A1:A4"))
==================== 

の方が速い。
そこで関数内では入れ物(SYUKU)使わない方が速い新仮説が私の中で急浮上。
でも上記の結果やはりws1に入れた方が速いと。

私の記述がまずいか、
WorkDayの祝日特有の現象か……。
まあ、前者か。
(; ^ω^)

WorkDay、あたりまえだが
祝日指定するとそれを考慮する分スピードが落ちる。

====================
        VV(i, 1) = WorksheetFunction.WorkDay(Cells(i, 6), -1 * Cells(i, 5).Value + 5, ws1.Range("A1:A24"))
==================== 

より

====================
        VV(i, 1) = WorksheetFunction.WorkDay(Cells(i, 6), -1 * Cells(i, 5).Value + 5, ws1.Range("A1:A2"))
==================== 

の方が速いし

====================
        VV(i, 1) = WorksheetFunction.WorkDay(Cells(i, 6), -1 * Cells(i, 5).Value + 5)
==================== 

のように祝日をなくすとより速い。

祝日をなくすとより速いとか、
なんてブラックな響きなんだ(笑)
……_(┐「ε:)_

まあ祝日を考慮せにゃならんからなくせないのだけれども。
ちなみに

====================
        VV(i, 1) = WorksheetFunction.WorkDay(Cells(i, 6), -1 * Cells(i, 15).Value + 5, ws1.Range("A:A"))
==================== 

のように列指定するとめちゃくちゃ遅くなるので注意。
データ数量が万単位だと遅くなるというか、処理おわらんよ(´・ω・`)

WorkDayより速い代替記述を検討してみたが現状いい案はなく
・祝日範囲を狭める
・すべてのデータにWorkDay⇒Ifで必要なデータのみWorkDay
で対処。
┐(´ー`)┌ヤレヤレ 

ブログ アーカイブ

ラベル

このブログを検索

スポンサーリンク

自己紹介

機械メーカー総合職正社員10年勤務後退職。 エクセルVBAプログラム歴 5年。 LibreOffice(無料)でVBAマクロ検証。
■Fortniteクエスト攻略動画■
■Twitter■
⇒詳細プロフィールを表示

QooQ