下記繰り返し処理を行うために、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
No.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
No.2
- 回答日時:
処理に一切手を加えず、これを付け足すだけで高速化するという魔法のフレーズがあります。
Application.ScreenUpdating = False
という一文をDoの前に入れてください。これだけで2倍は高速化します。ただしこれだけだと最後に残念なことになるので、Loop文の次にこれを必ず入れてください。
Application.ScreenUpdating = True
これはマクロ動作を常に画面表示に反映するかどうかの切り替えです。Falseになっている間は何をやっても表示に反映されません。Trueになると反映が復活します。
ありがとうございます。
画面表示、及び自動計算を止める等の処理をいれてみましたが、2分ぐらいかかります。
(1万行ぐらいあるデータを処理しようとしていました)
改善出来ればと思っております。
No.1
- 回答日時:
飛ばす行に、
何か 共通性が、
あるなら、
オートフィルターで、
飛ばす行を 絞って、
コピペ 一回で、
済ませば、
劇的に 早くなると、
思いますが、
肝心の 共通性は、
如何でしょうか?
もし、
そう言った 共通性が、
無い場合ですが、
無いなら 作業列を、
附し、
其所に 規則性、
今回ならば、
MOD(行番号-2,6)=0
と して、
此の箇所を あぶり出して、
オートフィルターで 除外し、
残り全域を 一括コピーし、
又、
お望みの Pasteを、
されては 如何でしょうか?
さて、
VBAは VBとは、
似て 非なる、
言語です。
VBでは 避け得ない、
objectタッチ回数の 増加も、
様々に 高級(言語)化された、
予約の 命令セットで、
objectへの タッチ回数増加回避が、
叶うように なっています。
只々、
動けば 良い、
と 言う、
ご志向なら 構わないのです。
ですが、
今回のように PCリソースの、
無駄遣いを 無くし、
PCフルパワーの 速度を、
謳歌したい場合は、
objectタッチ回数を 何とかして、
減らせないか 検討する事が、
最も 効果的です、
サイトでも 検証結果が、
ちらほら 見られますが、
objectタッチ回数を 減らす事によって、
処理速度が、
1千〜1万倍になる、
等と 言った事も、
ざらに 転がっています。
で 其れには、
Evaluateを 用いて、
シート関数で 高速一括処理を、
させたり、
ループを 使わず、
VBでは 出来ないが、
エクセルでは 出来る、
機能を 用いたり、
等々を なしていけば、
良いと 思いますよ。
くれぐれも 重ねて、
申しますが、
PCリソースを 大切にし、
無駄遣いを 減らし、
スペードを ある程度は、
求めるなら、
安易に ループさせる事は、
御法度です。
非VBA精通者に お伺いを、
立てたなら、
知らないが故に、
すぐに ループに、
頼るようですが、
此は 間違いです。
ループを 組む事は、
VBAでは、
エラー処理ルーチンを 持ちいた、
処理実現と、
同程度の 最終手段、
と お弁えください。
そして、
安易に ループで、
済ますものを 見たならば、
知ったかぶりを していると、
ご承知置きを ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) vba シートコピーの不具合 1 2022/06/25 17:48
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
excelのInitializeイベントとAc...
-
ACCESSのVBAにてExcelのシ...
-
エクセルVBAで名前の決まってい...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel・Word リサーチ機能を無...
-
配列数式の解除
-
Excel マクロ VBA プロシー...
-
UserForm1.Showでエラーになり...
-
教えて下さい
-
一つのTeratermのマクロで複数...
-
メッセージボックスのOKボタ...
-
String""から型'Double'への変...
-
End Sub が必要です。
-
マクロで"#N/A"のエラー行を削...
-
ExcelのVBA。public変数の値が...
-
TERA TERMを隠す方法
-
フランスの生年月日(jj/mm/aaaa)
-
実行時エラー'-2147467259(8000...
-
Excel VBAからAccessマクロを実...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSのVBAにてExcelのシ...
-
excelのInitializeイベントとAc...
-
Excelマクロ 別シートへ連続コ...
-
エクセルVBAで名前の決まってい...
-
「IsText」の使い方を教えてく...
-
EXCELで1シートのデータを複数...
-
同一ブック内・別シートの内容...
-
excel
-
VBAでシートをまたぐ処理の方法
-
Excel・Word リサーチ機能を無...
-
エクセルで特定の列が0表示の場...
-
特定のPCだけ動作しないVBAマク...
-
Excel マクロ VBA プロシー...
-
UserForm1.Showでエラーになり...
-
配列数式の解除
-
メッセージボックスのOKボタ...
-
教えて下さい
-
String""から型'Double'への変...
-
一つのTeratermのマクロで複数...
-
ExcelのVBA。public変数の値が...
おすすめ情報