• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBAに詳しい人に質問です。)

Excel VBAで空白の行を削除する方法について

このQ&Aのポイント
  • Excel VBAを使用して、ワークシートの7~300の行でF列が空白の行を削除する方法について教えてください。
  • 現在、For文を使用して行ごとに空白かどうかをチェックし、空白の場合は行を削除していますが、データが増えると処理速度が遅くなっています。
  • 処理速度を上げるための方法や改善点があれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#203218
noname#203218
回答No.6

下記のような方法もあるようです。 空白のセルを調べ、一括で行を削除する方法です。 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はサンプルコードがネット上にいくらでもありますので、ネット検索した方が早く解決出来ますよ。

mzakom
質問者

お礼

こちらの方法が1番速くなったのでBAとさせて頂きます。他の皆様も回答ありがとうございましたm(_ _)m

その他の回答 (7)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.8

参照が複雑とかあるのかな。作業中の再計算を止めると速くなる場合があるよ。 Application.Calculation = xlCalculationManual ' 自動計算を止める (ここに作業) Application.Calculation = xlCalculationAutomatic ' 自動計算を再開する

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

こんばんは! 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)
回答No.5

3です。 間違えました。 フィルタオプションではなくてオートフィルタ(空白セル以外)+コピぺで、元データ全削除。 フィルタの解除をお忘れなく。

  • FEX2053
  • ベストアンサー率37% (7991/21373)
回答No.4

では逆にScreenUpDatingを外して、実際にどこで動作が遅くなって 居るかをチェックしてみて下さい。 意外に、「ここじゃないか」と思った場所じゃないところで遅くなって いることがあります。たとえば「セルにデータを書き込む」という処理 は、そのセルの参照関係次第では、メチャメチャ時間がかかることが あったりしますので。

  • TAKA_R
  • ベストアンサー率32% (26/79)
回答No.3

どれくらい時間がかかっているのかが分かりませんが、 どうしてもfor文でなくてはならないというのでなければ、 「フィルタオプション」をおすすめします。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

あまり詳しくないですが(実験していないので実際の効果はわかりませんが) 遅い原因が削除した後にその下のデータを動かす必要があるためと考えるなら、 ・一旦配列に読み込んで、書き直すとか、 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_row_del.html ・削除すべき列を特定して、Rangeの文字列を生成して、複数行を選択して いっぺんに削除するとか、 で、早くなるような気がしますが、、、

回答No.1

そんなに詳しくないけど、とりあえず Sub Macro()  Application.ScreenUpdating = False  '内容  Application.ScreenUpdating = True End Sub とした場合でも、遅いでしょうか?

mzakom
質問者

補足

回答ありがとうございます。 申し訳ないです。Applicationオブジェクト既に入れていますm(_ _)m記載不足でした。

関連するQ&A

専門家に質問してみよう