
こんにちは
今、現在、とある条件にあった行を削除するマクロ作っているのですが、
インターネットを調べてみると後ろから探索して、1行ずつ消していくのがいいと書いてありました。
まぁ、その理屈はわかるんですが、それなら
「Unionでセルの範囲を結合してから、最後に一度に消してしまった方が速いのでは」
(消す作業が1度だけで済むから)
と思い試してみたんですが、実際試したところ・・・
ものすごく遅かったです。
(ちなみに、1万件のデータで削除した行数は6000ほどでした)
何故Union結合だと遅いのでしょうか?
速いマクロを作成するには、やはり後ろから探索して、1行ずつ消していくしかないのでしょうか?
以下は試したマクロです。
(test が unionで試したマクロ、test2が後ろから1行ずつ削除したマクロ)
Option Explicit
Public Sub test()
Dim r As Range
Dim r1 As Range
'Cells.Replace "-", " "
For Each r In Range("A2", Range("A65536").End(xlUp))
If r = r.Offset(1, 0) And r.Offset(0, 1) < r.Offset(1, 1) Then
If r1 Is Nothing Then
Set r1 = r
Else
Set r1 = Union(r1, r)
End If
End If
Next
r1.EntireRow.Delete
' r1.Select
End Sub
Public Sub test2()
Dim r As Range
Dim r1 As Range
Dim i As Integer
'Cells.Replace "-", " "
Application.ScreenUpdating = False
For i = Range("A65536").End(xlUp).Row To 1 Step -1
If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 2) < Cells(i + 1, 2) Then
Cells(i, 1).EntireRow.Delete
End If
Next
Application.ScreenUpdating = True
End Sub
No.5ベストアンサー
- 回答日時:
#2です。
行を削除するのはいずれにしても遅いと思うので、抽出する方法を追加で試してみました。
xl2010(32bit), WinXP SP3, 昔のCeleron 2.4GHzの環境です。
データは#2と同じで、1万行の内、半分程度を削除する条件です。
○下から、行削除 平均17秒程度
○セル範囲→配列→別配列に抽出→セル範囲に丸ごと代入 平均1.9秒程度
○フィルタオプションで別シート抽出 0.6秒程度
・フィルタオプションは意外に速く、見直しました。(抽出条件の複雑さにもよると思いますが)
・xl2010はxl2003までに比べて重たいイメージでしたが、行削除に何倍もかかるという訳ではありませんでした。
以上、ご参考まで。
回答遅くなりましたすみません。
なるほど、フィルタオプションですか。
エクセルの既存の機能を使った方が速いんですね。
他の方もいろいろ案を出してくださったのですが、実際に速度まで測って検討してくださったmitarashiさんをベストアンサーにさせていただきます
ありがとうございました
No.4
- 回答日時:
解決されていましたらスルーしてください。
速い遅いはわかりませんが、以下ではどうでしょうか
作業用にK列を使ってます。
都合悪ければ、With .Offset(, 10) 部分を変更してください。
Sub Sample()
On Error Resume Next
With Range("A2", Cells(Rows.Count, 1).End(xlUp))
With .Offset(, 10)
.Formula = "=IF(AND(A2=A3,B2<B3),1,"""")"
.Value = .Value
.SpecialCells(xlCellTypeConstants, 1).EntireRow.Delete
.ClearContents
End With
End With
End Sub
試される時には、戻せる状態で行ってください。
なお、上記は以下を参考にしていました。
VBAのことを教えてください
http://detail.chiebukuro.yahoo.co.jp/qa/question …
EntireRow を Union する方法もあるようです。
※ Excel VBA は不慣れなため、具体的説明は無理かも・・・・
(まずは、ヘルプを参照ください)
No.3
- 回答日時:
試された結果の通り、
Unionした結果に対して行を追加するのは遅かったと思うので、
複数の行の選択を1回でして、削除をすると別に遅くはないのでは?
Public Sub test3()
Dim r As Range
Dim r1 As Range
dim wkstr as String
wkstr = ""
For Each r In Range("A2", Range("A65536").End(xlUp))
If r = r.Offset(1, 0) And r.Offset(0, 1) < r.Offset(1, 1) Then
If wkstr = "" Then
wkstr = trim(cstr(r.row)) & ":" & trim(cstr(r.row))
Else
wkstr = wkstr & "," & trim(cstr(r.row)) & ":" & trim(cstr(r.row))
End If
End If
Next
range(wkstr).Delete
' r1.Select
End Sub
といった感じででも試してみられては。
(未検証)
・・・Cells(i, 1).EntireRow.Delete と rows(i).delete と処理速度が違ったかも。
(ただ、少数の行の処理ではわからないと思います。)
No.2
- 回答日時:
徒然なるままにやってみました
いずれも
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
を入れてあります。今回のケースでは後者は0.数秒くらいしか効きませんでしたが。
xl2000,WinXP SP3,初代Pentium4 3Gの環境です。
A,B,C列が数文字の文字列で、D列が3桁の乱数。乱数が500より大きい行を削除する事例です。
10000行に合わせました。
1.普通に下から行(行全体)を削除する 11秒台
2.条件に合うセル範囲を一旦Unionして丸ごと削除する 50数秒台
(範囲内だけ消しても、行全体を消しても大差無し)
と、ご指摘の通りUnionする方が数倍遅かったです。条件分岐等でRangeを操作する回数が増えるので、遅くなるのかもしれません。試しにUnionしたセルを丸ごと消すところをコメントアウトして実行すると40数秒かかりましたので、行を消すのにかかる時間は、1,2共に同じ位で、Unionする部分に時間がかかる分だけ遅くなると言えそうです。
ご自分のコードの要所にGetTickCountを入れて確認されれば良いと思います。
速くしたければ、一旦配列に収納して、上記の例では500未満のデータだけ別シートに書き出す方法をとれば数分の1~十分の一位の時間で処理可能でした。(redimとかしないで、同一サイズの配列に条件に合うデータを移し、丸ごと別シートに貼り付ける単純なコードです)ニーズに合うかどうかは分かりませんが、ご参考まで。
Unionはどうも、結合する数が膨大になっていくにつれて遅くなっていくような気がしました。
一概に早いマクロって理論道理にいかないものですね・・・
早いマクロ作るにはなかなか苦労します。
1万件もあるファイルが6ファイルもあるので、なるべく早いマクロを試してみようと思います。
配列のアイデアありがとうございます
作業シートを使うと早くなりそうですね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロで列を加えたら上手くいかなくなりました。 2 2022/05/23 17:59
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/11 08:33
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】大変な警告
【大喜利】「今このパソコンは大変危険な状態です」という警告メッセージを無視してパソコンを開いたら、こんなことが起こった
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
あなたの人生で一番ピンチに陥った瞬間は?
これまでの人生で今振り返ると「あの時、1番ピンチだったなぁ...」という瞬間はありますか?
-
泣きながら食べたご飯の思い出
泣きながら食べたご飯の思い出を教えてください。
-
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
エクセルマクロ 【空白セルを無視する方法を教えてください】
Excel(エクセル)
-
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
-
4
VBA 複数の行を高速で削除する方法
その他(プログラミング・Web制作)
-
5
【Excel VBA】複数ある特定の文字列を含む行を削除
Excel(エクセル)
-
6
【VBA】条件に一致しない行を削除したい
Visual Basic(VBA)
-
7
数式の結果が空白の時の空白扱い
Excel(エクセル)
-
8
データが入力されている隣のセルに当日日付と時刻を入力するExcel VBAプログラム
Visual Basic(VBA)
-
9
VBA 選択範囲とUnionの使い方について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロで最終行を取得してコピ...
-
Excel VBAでオートフィルタで抽...
-
【VBA】条件に一致しない行を削...
-
数値に見えるものはすべて数値...
-
エクセルのデータがない行には...
-
【VBA】条件に一致しない行を削...
-
Access2003レポート:最終ペー...
-
VBAで入力の結果を他のセルに反...
-
エクセルで空白行を削除する ...
-
VBA 複数列コンボボックス 値の...
-
エクセルマクロでの行削除の方...
-
マクロにて指定の文字間の文字...
-
Excel97 指定した行だけマク...
-
オートフィルターの複数条件検...
-
EXCEL VBAでA列にある空白行よ...
-
エクセルのマクロについて質問...
-
Excel マクロ 検索結果を別シ...
-
vbaエクセルマクロについて she...
-
Excelで、あるセルの値に応じて...
-
VB.net
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロで最終行を取得してコピ...
-
【VBA】条件に一致しない行を削...
-
数値に見えるものはすべて数値...
-
エクセルで空白行を削除する ...
-
Excel VBAでオートフィルタで抽...
-
VB.net
-
エクセルのデータがない行には...
-
列から特定の文字列検索→該当以...
-
【VBA】条件に一致しない行を削...
-
Excel マクロ 検索結果を別シ...
-
マクロにて指定の文字間の文字...
-
エクセルで階層図を作る方法
-
EXCEL VBAでA列にある空白行よ...
-
VBAで入力の結果を他のセルに反...
-
各個体に対する平均値の自動計...
-
vbaエクセルマクロについて she...
-
テキストファイル読み込みにお...
-
Excel97 指定した行だけマク...
-
コマンドボタンでの自動計算マ...
-
Access2003レポート:最終ペー...
おすすめ情報