■■■エクセルVBAマクロの話■■■
一般的にWorksheetsオブジェクトはSetした方が速いと言われている。
Application.VLookupとかの関数内でもそうか検証してみた。
■Setしてないやつ
MR = Cells(Rows.Count, 2).End(xlUp).Row '最終行,B:B
====================
■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、あたりまえだが
祝日指定するとそれを考慮する分スピードが落ちる。
====================
より
====================
の方が速いし
====================
のように祝日をなくすとより速い。
祝日をなくすとより速いとか、
なんてブラックな響きなんだ(笑)
……_(┐「ε:)_
まあ祝日を考慮せにゃならんからなくせないのだけれども。
ちなみに
====================
のように列指定するとめちゃくちゃ遅くなるので注意。
データ数量が万単位だと遅くなるというか、処理おわらんよ(´・ω・`)
WorkDayより速い代替記述を検討してみたが現状いい案はなく
・祝日範囲を狭める
・すべてのデータにWorkDay⇒Ifで必要なデータのみWorkDay
で対処。
┐(´ー`)┌ヤレヤレ
私の記述がまずいか、
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
で対処。
┐(´ー`)┌ヤレヤレ