- ベストアンサー
Excel VBAで空白の行を削除する方法について
- Excel VBAを使用して、ワークシートの7~300の行でF列が空白の行を削除する方法について教えてください。
- 現在、For文を使用して行ごとに空白かどうかをチェックし、空白の場合は行を削除していますが、データが増えると処理速度が遅くなっています。
- 処理速度を上げるための方法や改善点があれば教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
下記のような方法もあるようです。 空白のセルを調べ、一括で行を削除する方法です。 Sub test() Dim m_Cell As Range Dim m_Union As Range For Each m_Cell In Range("F7:F300") If m_Cell.Value = "" Then If m_Union Is Nothing Then Set m_Union = m_Cell Set m_Union = Union(m_Union, m_Cell) End If Next If Not m_Union Is Nothing Then m_Union.EntireRow.Delete End Sub VBAはサンプルコードがネット上にいくらでもありますので、ネット検索した方が早く解決出来ますよ。
その他の回答 (7)
- rinkun
- ベストアンサー率44% (706/1571)
参照が複雑とかあるのかな。作業中の再計算を止めると速くなる場合があるよ。 Application.Calculation = xlCalculationManual ' 自動計算を止める (ここに作業) Application.Calculation = xlCalculationAutomatic ' 自動計算を再開する
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 300行程度であればループさせてもさほど時間を要することはないと思いますが、 実際問題として、速度が落ちている!というコトですので・・・ すでに適切な回答は出ていますが、作業列を使って並び替えでの一例です。 Sub 行削除() Dim c As Range, wS As Worksheet Set wS = Worksheets("一覧") Application.ScreenUpdating = False wS.Range("A:A").Insert With Range(wS.Cells(7, "A"), wS.Cells(300, "A")) .Formula = "=IF(G7="""",2,1)" .Value = .Value End With wS.Rows(7 & ":" & 300).Sort key1:=wS.Cells(7, "A"), order1:=xlAscending, Header:=xlNo Set c = wS.Range("A:A").Find(what:=2, LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then wS.Rows(c.Row & ":" & 300).Delete End If wS.Range("A:A").Delete Application.ScreenUpdating = True End Sub こんな感じではどうでしょうか?m(_ _)m
- TAKA_R
- ベストアンサー率32% (26/79)
3です。 間違えました。 フィルタオプションではなくてオートフィルタ(空白セル以外)+コピぺで、元データ全削除。 フィルタの解除をお忘れなく。
- FEX2053
- ベストアンサー率37% (7991/21373)
では逆にScreenUpDatingを外して、実際にどこで動作が遅くなって 居るかをチェックしてみて下さい。 意外に、「ここじゃないか」と思った場所じゃないところで遅くなって いることがあります。たとえば「セルにデータを書き込む」という処理 は、そのセルの参照関係次第では、メチャメチャ時間がかかることが あったりしますので。
- TAKA_R
- ベストアンサー率32% (26/79)
どれくらい時間がかかっているのかが分かりませんが、 どうしてもfor文でなくてはならないというのでなければ、 「フィルタオプション」をおすすめします。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
あまり詳しくないですが(実験していないので実際の効果はわかりませんが) 遅い原因が削除した後にその下のデータを動かす必要があるためと考えるなら、 ・一旦配列に読み込んで、書き直すとか、 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_row_del.html ・削除すべき列を特定して、Rangeの文字列を生成して、複数行を選択して いっぺんに削除するとか、 で、早くなるような気がしますが、、、
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
そんなに詳しくないけど、とりあえず Sub Macro() Application.ScreenUpdating = False '内容 Application.ScreenUpdating = True End Sub とした場合でも、遅いでしょうか?
補足
回答ありがとうございます。 申し訳ないです。Applicationオブジェクト既に入れていますm(_ _)m記載不足でした。
お礼
こちらの方法が1番速くなったのでBAとさせて頂きます。他の皆様も回答ありがとうございましたm(_ _)m