厳密には違う点もあるかもしれませんが細かい事を気にしない方は以下要点を真似てください。
【とりあえず記述できるけど処理が遅い人向け】
■型を宣言する
====================
Dim MR As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row
====================
基本です。適切な型を宣言すれば気持ち速いかも。
数字はLong、文字はString、オブジェクトはObject、日付はDate、配列等はVariant 。
Variantの場合は型宣言省略しましょう。(デフォルトの型がVariantの為)。基本です。適切な型を宣言すれば気持ち速いかも。
数字はLong、文字はString、オブジェクトはObject、日付はDate、配列等はVariant 。
■Cellsを使う
====================Range("A1:B" & MR)
====================
↓
====================
Range(Cells(1,1),Cells(MR,2))
====================
可能な限りCells(数値,数値)を多用しRange("文字")は控えて下さい。
Range内の文字列"A1:B"を数字に変換するのに僅かに時間がかかります。
Range("A1")でなくCells(1,1)を使ってください。
パソコンにとって分かりやすく容易な命令を記述する事で高速化します。
パソコンの言語は数値、Cellsは数値、Rangeの"A1:B"は文字。
文字をいちいち数値に変換していたらパソコンさんブチ切れ寸前です。
■配列を駆使する
1つ1つのセルにアクセスし処理を行うのは時間がかかります。====================
Range("C2:C" & d).Formula = "=A2+B2"
Range("C2:C" & d).Select
Selection.Value = Selection.Value
====================
↓
====================Dim i As Long, A As Long, B As Long
AA = Range(Cells(1, 11), Cells(MR, 11))
BB = Range(Cells(1, 12), Cells(MR, 12))
CC = Range(Cells(1, 13), Cells(MR, 13))
For i = 2 To MR
A = AA(i, 1)
B = BB(i, 2)
CC(i, 1) = A + B
Next i
Range(Cells(1, 13), Cells(MR, 13)) = CC
====================
セルデータ範囲をまとめて配列に格納(1回目)し計算を行い
計算結果をまとめてセルに格納(2回目)します。
セルへのアクセス回数2回です。
セルに関数を入力するのではなくVBAの関数を使います。
エクセルとは範囲などの記述が少々異なる点
使用できない関数がある点に注意です。
上記は昇順並び替え済み8列目の同じ文字列を連番カウントし
数値を26列目に入れます。
Application.WindowState = xlMinimized と
Application.WindowState = xlNormal は
私の気分で付けているだけなので省略してもおkです。
記述した場合マクロ処理が終わったら\(^o^)/ブワッ!!
とエクセルがパソコン画面に表示されます。
他は一般的には記述した方が速いでしょう。
我がマクロは上記ダメな点を網羅しており書き換えにより処理時間
[1時間30分]⇒[40分]まで短縮されましたとさ。
_(:3 」∠)_
計算結果をまとめてセルに格納(2回目)します。
セルへのアクセス回数2回です。
AA = Range(Cells(1, 11), Cells(MR, 11))
を
を
AA = Range(Cells(1, 11), Cells(MR, 13))
にしてBB,CC省略すればより速いかもしれません。
にしてBB,CC省略すればより速いかもしれません。
■関数を駆使する
====================
D = Range("B1048576").End(xlUp).Row
Range("U2").Formula = "=COUNTIF($G$2:G2,G2)"
Range("U2").AutoFill Destination:=Range("U2:U" & D)
Range("U2:U" & D).Select
Selection.Value = Selection.Value
====================
↓
====================
↓
====================
For i = 2 To MR
Cells(i, 26) = WorksheetFunction.CountIf(Range(Cells(2, 8), Cells(i, 8)), Cells(i, 8))
Next i
====================セルに関数を入力するのではなくVBAの関数を使います。
エクセルとは範囲などの記述が少々異なる点
使用できない関数がある点に注意です。
上記は昇順並び替え済み8列目の同じ文字列を連番カウントし
数値を26列目に入れます。
■画面最小化、画面更新無効、警告無効、自動計算無効
====================
Application.WindowState = xlMinimized
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
~処理~
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.WindowState = xlNormal
====================Application.WindowState = xlMinimized と
Application.WindowState = xlNormal は
私の気分で付けているだけなので省略してもおkです。
記述した場合マクロ処理が終わったら\(^o^)/ブワッ!!
とエクセルがパソコン画面に表示されます。
他は一般的には記述した方が速いでしょう。
■selectを使わない
====================
Cells(1, 1).CurrentRegion.Select
Selection.Copy
====================
Selectは時間の無駄なので極力排除しましょう。
"st1"アクティブ状態なのでActiveSheet.とWorksheets("st1").は重複不要。
ついでにRange("A1")⇒Cells(1, 1)変更。
上記に気を付けて記述または見直し書き換えを行えば
ブチ切れ寸前の速さになると思われます。====================
↓
====================
Cells(1, 1).CurrentRegion.Copy
========================================
Cells(1, 1).CurrentRegion.Copy
Selectは時間の無駄なので極力排除しましょう。
■重複して同じ処理を記述しない
====================
Worksheets("st1").Activate
ActiveSheet.Range("A1").AutoFilter Field:=15, Criteria1:=Array("キレたK", "ブチ切れ寸前", "高速化"), Operator:=xlFilterValues
ActiveSheet.Range("A1").AutoFilter Field:=19, Criteria1:="<=0"
Worksheets("st1").Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
====================
↓
====================
Worksheets("st1").Activate
====================
Worksheets("st1").Activate
Cells(1, 1).AutoFilter Field:=15, Criteria1:=Array("キレたK", "ブチ切れ寸前", "高速化"), Operator:=xlFilterValues
Cells(1, 1).AutoFilter Field:=19, Criteria1:="<=0"
Cells(1, 1).CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
===================="st1"アクティブ状態なのでActiveSheet.とWorksheets("st1").は重複不要。
ついでにRange("A1")⇒Cells(1, 1)変更。
上記に気を付けて記述または見直し書き換えを行えば
我がマクロは上記ダメな点を網羅しており書き換えにより処理時間
[1時間30分]⇒[40分]まで短縮されましたとさ。
_(:3 」∠)_