こんにちは
今、現在、とある条件にあった行を削除するマクロ作っているのですが、
インターネットを調べてみると後ろから探索して、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も見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
ちょっと先の未来クイズ第5問
日本漢字能力検定協会が主催し、12月12日に発表される、2024年の「今年の漢字」に選ばれる漢字一文字は何でしょう?
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
【Excel VBA】複数ある特定の文字列を含む行を削除
Excel(エクセル)
-
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
-
4
指定した文字があった場合、その行を削除するマクロが欲しいです
Excel(エクセル)
-
5
VBA Shapes コピーと名前
Excel(エクセル)
-
6
数式による空白を無視して最終行を取得するマクロ
Excel(エクセル)
-
7
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
8
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
9
データが入力されている隣のセルに当日日付と時刻を入力するExcel VBAプログラム
Visual Basic(VBA)
-
10
VBA 選択範囲とUnionの使い方について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのデータがない行には...
-
Excel マクロ 検索結果を別シ...
-
【VBA】指定月のオートフィルタ...
-
Excel VBAでオートフィルタで抽...
-
VB.net
-
【VBA】条件に一致しない行を削...
-
数値に見えるものはすべて数値...
-
マクロで最終行を取得してコピ...
-
エクセルで特定の文字が入って...
-
excel2021で実行できないマクロ...
-
エクセルVBA任意の文字で検索し...
-
vbaエクセルマクロについて she...
-
エクセルで空白行を削除する ...
-
Excel VBA オートフィルタの結...
-
オートフィルターの複数条件検...
-
Access2003レポート:最終ペー...
-
Excel97 指定した行だけマク...
-
マクロにて指定の文字間の文字...
-
【VBA】条件に一致しない行を削...
-
コマンドボタンでの自動計算マ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルのデータがない行には...
-
【VBA】条件に一致しない行を削...
-
エクセルで空白行を削除する ...
-
マクロで最終行を取得してコピ...
-
数値に見えるものはすべて数値...
-
Excel VBAでオートフィルタで抽...
-
【VBA】条件に一致しない行を削...
-
VB.net
-
EXCEL VBAでA列にある空白行よ...
-
エクセルのVBAで指定した行数の...
-
Excel マクロ 検索結果を別シ...
-
列から特定の文字列検索→該当以...
-
各個体に対する平均値の自動計...
-
【至急】Excel 同一人物の情報...
-
Excel 別ブックから該当データ...
-
マクロにて指定の文字間の文字...
-
Excel VBA オートフィルタの結...
-
エクセルマクロでグループごと...
-
VBAで特定の行と一つ上の行を削...
-
エクセルで階層図を作る方法
おすすめ情報