dポイントプレゼントキャンペーン実施中!

下記繰り返し処理を行うために、VBA初心者ですが自分なりに作成してみました。
ただ、繰り返し回数が多いのですごく時間が掛かってしまいます。
速く出来る手法あるでしょうか?

処理したい事
①ワークシート"Plan2"の9行目~13行目までをコピーして、
 ワークシート"Plan"の同じ行に数式ペーストを行う。
 これを1行飛ばし(例:15行目~19行目→21行目~25行目・・・)で
 ワークシート"Plan"の最終行まで繰り返す。
②ワークシート"Plan"のAH9~13行目最終列までの条件付き書式をクリアする。
 これを1行飛ばし(例:AH15~19行目最終列→AH21~25行目最終列・・・)で
 ワークシート"Plan"の最終行まで繰り返す。

下記センスの無い構文になっているかと思いますが、
宜しくお願い致します。

Dim lastRow As Long
Dim lastCol As Long
Dim GYO1 As Long

lastRow = Sheets("Plan).Cells(Rows.Count, "AF").End(xlUp).Row
lastCol = Sheets("Plan).Cells(7, Columns.Count).End(xlToLeft).Column

GYO1 = 9
Do
Sheets("Plan2").Select
Rows(GYO1 & ":" & GYO1 + 4).Copy
Sheets("Plan").Select
Rows(GYO1 & ":" & GYO1).Select
Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range(Cells(GYO1, "AH"), Cells(GYO1 + 4, lastCol)).FormatConditions.Delete
GYO1 = GYO1 + 6
If GYO1 > lastRow Then Exit Do
Loop

A 回答 (3件)

質問文のコードをベースに以下の変更を加えました。


元データはコピーを取ってお試しください。
・画面更新を無効にした。
・selectを最小限にした。
・Do~LoopをFor~Nextにした。(判定式を使わなくした)

’*****を付けた3つの行は実行時間を計測するためのものです。比較に使用ください。


Sub AA2()
t0 = Time '*****先頭行
Application.ScreenUpdating = False
Dim lastRow As Long
Dim lastCol As Long
Dim GYO1 As Long

lastRow = Sheets("Plan2").Cells(Rows.Count, "AF").End(xlUp).Row
lastCol = Sheets("Plan2").Cells(7, Columns.Count).End(xlToLeft).Column

Sheets("Plan").Select
For GYO1 = 9 To lastRow Step 6
Worksheets("Plan2").Rows(GYO1 & ":" & GYO1 + 4).Copy
Rows(GYO1 & ":" & GYO1).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Range(Cells(GYO1, "AH"), Cells(GYO1 + 4, lastCol)).FormatConditions.Delete
Next GYO1
Application.ScreenUpdating = True
t = Time - t0 '*****最後の行から2行目
MsgBox "所要時間は" & Minute(t) & "分" & Second(t) & "秒 でした" '*****最後の行
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。
当初より早く処理する事が出来ました。

お礼日時:2019/05/23 12:10

処理に一切手を加えず、これを付け足すだけで高速化するという魔法のフレーズがあります。



Application.ScreenUpdating = False

という一文をDoの前に入れてください。これだけで2倍は高速化します。ただしこれだけだと最後に残念なことになるので、Loop文の次にこれを必ず入れてください。

Application.ScreenUpdating = True

これはマクロ動作を常に画面表示に反映するかどうかの切り替えです。Falseになっている間は何をやっても表示に反映されません。Trueになると反映が復活します。
    • good
    • 0
この回答へのお礼

ありがとうございます。
画面表示、及び自動計算を止める等の処理をいれてみましたが、2分ぐらいかかります。
(1万行ぐらいあるデータを処理しようとしていました)
改善出来ればと思っております。

お礼日時:2019/05/16 15:58

飛ばす行に、


何か 共通性が、
あるなら、

オートフィルターで、
飛ばす行を 絞って、

コピペ 一回で、
済ませば、

劇的に 早くなると、
思いますが、

肝心の 共通性は、
如何でしょうか?


もし、
そう言った 共通性が、
無い場合ですが、

無いなら 作業列を、
附し、
其所に 規則性、

今回ならば、
MOD(行番号-2,6)=0
と して、

此の箇所を あぶり出して、
オートフィルターで 除外し、
残り全域を 一括コピーし、

又、
お望みの Pasteを、
されては 如何でしょうか?


さて、

VBAは VBとは、
似て 非なる、
言語です。


VBでは 避け得ない、
objectタッチ回数の 増加も、

様々に 高級(言語)化された、
予約の 命令セットで、

objectへの タッチ回数増加回避が、
叶うように なっています。


只々、
動けば 良い、

と 言う、
ご志向なら 構わないのです。


ですが、
今回のように PCリソースの、
無駄遣いを 無くし、

PCフルパワーの 速度を、
謳歌したい場合は、

objectタッチ回数を 何とかして、
減らせないか 検討する事が、
最も 効果的です、

サイトでも 検証結果が、
ちらほら 見られますが、

objectタッチ回数を 減らす事によって、
処理速度が、
1千〜1万倍になる、

等と 言った事も、
ざらに 転がっています。


で 其れには、
Evaluateを 用いて、
シート関数で 高速一括処理を、
させたり、

ループを 使わず、
VBでは 出来ないが、
エクセルでは 出来る、
機能を 用いたり、

等々を なしていけば、
良いと 思いますよ。


くれぐれも 重ねて、
申しますが、

PCリソースを 大切にし、
無駄遣いを 減らし、
スペードを ある程度は、
求めるなら、

安易に ループさせる事は、
御法度です。


非VBA精通者に お伺いを、
立てたなら、

知らないが故に、
すぐに ループに、
頼るようですが、
此は 間違いです。


ループを 組む事は、
VBAでは、

エラー処理ルーチンを 持ちいた、
処理実現と、

同程度の 最終手段、
と お弁えください。


そして、
安易に ループで、
済ますものを 見たならば、

知ったかぶりを していると、
ご承知置きを ください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
マクロで動作させたい理由があったので恐縮ながら質問させて頂きました。
工夫してみたいと思います。

お礼日時:2019/05/16 15:58

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