こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

Excel2013にしたらVBAがすごく重くなった

会社のPCがExcel2010からExcel2013に変更されたのですが、Excel2010の環境で作成していたVBAマクロの処理がもの凄く遅くなってしまいました。


Excel2010では10秒ほど待てば終わった処理が30分以上かかるようになってしまい、業務効率を上げるために作ったVBAが逆に非効率になってしまい困っております。
(フリーズしたような感じになりますが、長時間までは処理は終わり、エラーは出ておりません)


Excel2013で重くなった箇所を調べていたら、下記コード部分の繰返し処理で重くなっているのが分かりました。
処理の概要は、「全体」シートの指定列の最終行のセルから指定された番号(12345)があるか1行ずつ調べていき、ヒットしたらその行を全体を切取り、「●●」シートの最終行に貼り付けていく単純なものです。
「全体」シート行数は8000~10000行あります。


・重くなっている処理の箇所
==================================
Application.ScreenUpdating = False

ActiveWorkbook.Worksheets("全体").Activate

LastRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To LastRow
If Cells(i, 5).Value Like "12345" Then
Rows(i).Cut Sheets("●●").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End If
Next i
==================================

Excel2010で問題のなかった処理がExcel2013になって途端に重くなった原因自体も分かりませんが、問題点の回避方法や処理速度を改善する方法はありませんでしょうか。

よろしくお願いいたします。

投稿日時 - 2014-10-09 14:41:11

QNo.8784414

困ってます

質問者が選んだベストアンサー

ランダムデータで試してみましたが一瞬でしたねぇ。
余計な処理が行われていたりしませんか?ステップ実行で確認してみてください。

■自動計算の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

投稿日時 - 2014-10-09 17:10:20

お礼

回答ありがとうございます。

提示していただいたオートフィルタでやるサンプルコードを使ってみたら劇的に早くなりました。
(自動計算のON・OFFはあまり変化を感じられず)
シートを跨ぐコピー&ペーストの回数をオートフィルタで一気に減らした効果なんでしょうね。


私の一行ずつ調べるやり方はコードが短くてシンプルですが、行数が多くなるほど処理が重くなってしまうのだと思います。
ただ、上記のやり方でExcel2013だと処理が凄く重くなってしまう元ファイルを何の手も加えずにExcel2010が入っているPCにコピーして実行すると十数秒で処理が終わるんですよね・・

Excel2010と2013でVBAの重要な仕様の何かが変わっているとしか思えません。
その何かが検索してもそれらしい内容がヒットせず、本当の原因は不明のままなので今後も問題なく動いてたマクロが急に動かなくなったりしそうで不安です。

今回の問題は教えて頂いたオートフィルを活用して回避したいと思います。
ありがとうございました。

投稿日時 - 2014-10-10 15:40:35

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.1

原因はわかりませんが、LastRowの値が期待していたより大きくなってませんか?
msgboxか何かで、処理中にLastRowの値をチェックしてみて如何でしょうか?

投稿日時 - 2014-10-09 15:01:26

補足

返信ありがとうございます。
全体シートには8449行あり、LastRowの値も8449なので正常に値を取得できております。
For i = 1 To LastRowも、最初は1 to 8449となっていました。
ちなみに、LastRowのデータ型はLongにしてあります。

投稿日時 - 2014-10-09 15:41:21

-広告-
-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-