- ベストアンサー
Excel2010からExcel2013に変更したらVBAの処理が重くなった!処理速度を改善する方法は?
- 会社のPCがExcel2010からExcel2013に変更されたのですが、Excel2010の環境で作成していたVBAマクロの処理がもの凄く遅くなってしまいました。Excel2010では10秒ほど待てば終わった処理が30分以上かかるようになり、業務効率を上げるために作ったVBAが逆に非効率になってしまい困っています。
- Excel2013で重くなった箇所を調べていたら、下記コード部分の繰返し処理で重くなっているのが分かりました。処理の概要は、「全体」シートの指定列の最終行のセルから指定された番号(12345)があるか1行ずつ調べていき、ヒットしたらその行を全体を切取り、「●●」シートの最終行に貼り付けていく単純なものです。「全体」シート行数は8000~10000行あります。
- Excel2010で問題のなかった処理がExcel2013になって途端に重くなった原因自体も分かりませんが、問題点の回避方法や処理速度を改善する方法はありませんでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ランダムデータで試してみましたが一瞬でしたねぇ。 余計な処理が行われていたりしませんか?ステップ実行で確認してみてください。 ■自動計算のON・OFFを追加するとか。 'OFF Application.Calculation = xlCalculationManual 'ON Application.Calculation = xlCalculationAutomatic ■オートフィルタでやってみるとか。 Sub Macro1() Dim LastRow As Long, mySt(1) As Worksheet 'シート設定 Set mySt(0) = Worksheets("全体") Set mySt(1) = Worksheets("Sheet2") With mySt(0) LastRow = .Cells(Rows.Count, 1).End(xlUp).Row .Rows(1).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove With .Range(.Rows(1), .Rows(LastRow)) .AutoFilter Field:=5, Criteria1:="=12345", Operator:=xlAnd With .SpecialCells(xlCellTypeVisible) .Copy mySt(1).Rows(1) .ClearContents End With End With .Rows(1).Delete End With mySt(1).Rows(1).Delete End Sub ■その他高速化テク http://officetanaka.net/Excel/vba/speed/index.htm
その他の回答 (1)
- FEX2053
- ベストアンサー率37% (7991/21371)
原因はわかりませんが、LastRowの値が期待していたより大きくなってませんか? msgboxか何かで、処理中にLastRowの値をチェックしてみて如何でしょうか?
補足
返信ありがとうございます。 全体シートには8449行あり、LastRowの値も8449なので正常に値を取得できております。 For i = 1 To LastRowも、最初は1 to 8449となっていました。 ちなみに、LastRowのデータ型はLongにしてあります。
お礼
回答ありがとうございます。 提示していただいたオートフィルタでやるサンプルコードを使ってみたら劇的に早くなりました。 (自動計算のON・OFFはあまり変化を感じられず) シートを跨ぐコピー&ペーストの回数をオートフィルタで一気に減らした効果なんでしょうね。 私の一行ずつ調べるやり方はコードが短くてシンプルですが、行数が多くなるほど処理が重くなってしまうのだと思います。 ただ、上記のやり方でExcel2013だと処理が凄く重くなってしまう元ファイルを何の手も加えずにExcel2010が入っているPCにコピーして実行すると十数秒で処理が終わるんですよね・・ Excel2010と2013でVBAの重要な仕様の何かが変わっているとしか思えません。 その何かが検索してもそれらしい内容がヒットせず、本当の原因は不明のままなので今後も問題なく動いてたマクロが急に動かなくなったりしそうで不安です。 今回の問題は教えて頂いたオートフィルを活用して回避したいと思います。 ありがとうございました。