- ベストアンサー
EXCEL マクロ 列の削除に時間がかかる
列はY列まで、行はおおよそ400~500行くらいのエクセルの表があります。 マクロで飛び飛びに行の削除を記録したのですが、処理に時間がかかっています。 もっとスムーズに早くする方法はありますか? ご教授おねがいします。 Range( _ "A:D,H:H,I:J,K:K,M:N,P:U,W:W,X:Y"). _ Select Selection.Delete Shift:=xlToLeft
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 ちょっと面白そうなので試してみました。 私の場合、配列数式を1000行を数列入れまして、行ってみました。 ストップウォッチは、zap35さんのものを使わせていただきました。 何もない状態でやると、31.25秒かかります。 Application.Calculation = xlManual を入れると、0.485 秒 Application.Calculation = xlManual Application.ScreenUpdating = False (画面切り替わり停止。Windowを最小化にする必要はありません。) を入れると、逆に、0.500秒 原因は、おそらく、復帰の時に、逆に時間が取られるのだと思います。 Sub MyTest1() Application.Calculation = xlManual 'Application.ScreenUpdating = False Range("A:D,H:H,I:J,K:K,M:N,P:U,W:W,X:Y").Delete Shift:=xlToLeft 'Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub 以下のマクロを使ってみると、 0.422 秒となります。ただし、条件によっても変わります。 Sub MyTest2() Application.ScreenUpdating = False Application.Calculation = xlManual Range("E:G,L:L,O:O,V:V").Columns.Hidden = True Range("A:Y").SpecialCells(xlCellTypeVisible).Delete Cells.Columns.Hidden = False Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub 「Application.ScreenUpdating」を使うかは迷いましたが、入れておきます。 変数を上手に使えば、もう少し速くなるかもしれませんが、一応、こんなところかしらね。ただ、計算式が入っていない状態で、すべてが遅いとしたら、フォントの表示などに問題があるかもしれません。そちらのほうは良く分かりません。
その他の回答 (3)
- zap35
- ベストアンサー率44% (1383/3079)
#02です。 A1:Z2000の全てのセルに全角文字30文字を入力し、usamimikさんのマクロを動かしたら381msでした。更に10000行まで値を入力しても大差はありませんでした。私の環境はPen4 1.2GHzのノートパソコンです。 >コードの問題とはどういうことでしょうか? これは質問文に書かれているコード以外にも掲載されていないコードがあり、そちらの方で時間がかかっているのではないかと考えたのです。 >計算式は使っていません とのことですが、結果が表示されない計算式が隠れていませんか? 新規のブックで値だけを入力してマクロ実行時間を計測すれば、何か違いが分かるかもしれませんよ。
お礼
ありがとうございます。 ためしに他のPCでマクロを実行してみたところ ものすごく早くマクロが完了しました。 どうやら私のPCのせいだったようです。 ありがとうございました。
- zap35
- ベストアンサー率44% (1383/3079)
遅い? 処理時間を以下のマクロで計測してみました 私のノートパソコンでは、結果は10msでした。(精度は10ms程度ですが…) Declare Function GetTickCount Lib "kernel32" () As Long Sub Macro1() Dim strt, stp As Long strt = GetTickCount() Range("A:D,H:H,I:J,K:K,M:N,P:U,W:W,X:Y").Select Selection.Delete Shift:=xlToLeft stp = GetTickCount() MsgBox ("処理時間" & stp - strt & "ms") End Sub 以下のようにSelectをやめれば多少速くなりますが、微々たるものだと思います Sub Macro1() Dim strt, stp As Long Range("A:D,H:H,I:J,K:K,M:N,P:U,W:W,X:Y").Delete Shift:=xlToLeft End Sub 遅いのは質問に書かれたコードの問題ではないのではないでしょうか?
補足
お答えありがとうございます。 ストップウォッチで計ってみたところ14秒かかっています。 zap35さんのMacro1で12秒でした。 Y列までの内、6列に文字が入っています。残すL列は長いもので 全角20文字ほど入力されています。 コードの問題とはどういうことでしょうか? スペースの空きすぎどかですか?
- Zero_0
- ベストアンサー率35% (72/201)
列はY列まで、行は500行のデータを、かかれているマクロで削除するには1秒かかりません。原因は別にあると思われます。 たとえば、計算式が別シートにあるとかそのようなことはありませんか。計算式があるとデータが変化したときにいちいち再計算が始まり処理が遅れると思います。 自動計算を止めて、その後実行する方法はどうでしょう。 Application.Calculation = xlManual 計算を手動にします 処理の後 Application.Calculation = xlAutomatic 計算を自動にします。 そのほか、画面に表示しているとその処理にも時間がかかりますので、最小化してその後、削除処理を、終了後、最大化するとスピードアップもできます。
補足
お答えありがとうございます。計算式は入っておりません。 画面表示を小さくしてやってみます。
補足
ありがとうございます。 なんと5秒台に縮まりました。 どんなマクロ言語なのかは初心者なのでよく分かりませんが これから勉強して理解していきたいと思っております。 ありがとうございました。