プロが教えるわが家の防犯対策術!

列は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

A 回答 (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」を使うかは迷いましたが、入れておきます。

変数を上手に使えば、もう少し速くなるかもしれませんが、一応、こんなところかしらね。ただ、計算式が入っていない状態で、すべてが遅いとしたら、フォントの表示などに問題があるかもしれません。そちらのほうは良く分かりません。

この回答への補足

ありがとうございます。
なんと5秒台に縮まりました。
どんなマクロ言語なのかは初心者なのでよく分かりませんが
これから勉強して理解していきたいと思っております。
ありがとうございました。

補足日時:2007/11/16 06:46
    • good
    • 0

#02です。


A1:Z2000の全てのセルに全角文字30文字を入力し、usamimikさんのマクロを動かしたら381msでした。更に10000行まで値を入力しても大差はありませんでした。私の環境はPen4 1.2GHzのノートパソコンです。

>コードの問題とはどういうことでしょうか?
これは質問文に書かれているコード以外にも掲載されていないコードがあり、そちらの方で時間がかかっているのではないかと考えたのです。

>計算式は使っていません
とのことですが、結果が表示されない計算式が隠れていませんか?
新規のブックで値だけを入力してマクロ実行時間を計測すれば、何か違いが分かるかもしれませんよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ためしに他のPCでマクロを実行してみたところ
ものすごく早くマクロが完了しました。

どうやら私のPCのせいだったようです。
ありがとうございました。

お礼日時:2007/11/16 06:50

遅い? 処理時間を以下のマクロで計測してみました


私のノートパソコンでは、結果は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文字ほど入力されています。

コードの問題とはどういうことでしょうか?
スペースの空きすぎどかですか?

補足日時:2007/11/14 00:41
    • good
    • 0

列はY列まで、行は500行のデータを、かかれているマクロで削除するには1秒かかりません。

原因は別にあると思われます。

たとえば、計算式が別シートにあるとかそのようなことはありませんか。計算式があるとデータが変化したときにいちいち再計算が始まり処理が遅れると思います。

自動計算を止めて、その後実行する方法はどうでしょう。
Application.Calculation = xlManual  計算を手動にします
処理の後
Application.Calculation = xlAutomatic 計算を自動にします。

そのほか、画面に表示しているとその処理にも時間がかかりますので、最小化してその後、削除処理を、終了後、最大化するとスピードアップもできます。

この回答への補足

お答えありがとうございます。計算式は入っておりません。
画面表示を小さくしてやってみます。

補足日時:2007/11/14 00:39
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています