重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

以下のようなFor文を使用して、F列が空白の場合、その行を削除するマクロを組んでいます。
しかし、他のシートなどデータが肥大になってきて、削除速度がかなり落ちました。
どうにか速度をあげる方法はないでしょうか?
ワークシートの7~300の行でF列が空白の行を削除できれば良いです。
F列にはVLOOKUP関数で、検索に引っかからなかった場合に空白になるようにしています。
詳しい方アドバイスよろしくお願いします。

For k = 300 To 7 Step -1
If Worksheets("一覧").Cells(k, "F") = "" Then
Worksheets("一覧").Rows(k).Delete
End If
Next k

A 回答 (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はサンプルコードがネット上にいくらでもありますので、ネット検索した方が早く解決出来ますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/06 19:14

参照が複雑とかあるのかな。

作業中の再計算を止めると速くなる場合があるよ。

Application.Calculation = xlCalculationManual ' 自動計算を止める
(ここに作業)
Application.Calculation = xlCalculationAutomatic ' 自動計算を再開する
    • good
    • 0

こんばんは!



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
    • good
    • 0

3です。



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

では逆にScreenUpDatingを外して、実際にどこで動作が遅くなって


居るかをチェックしてみて下さい。

意外に、「ここじゃないか」と思った場所じゃないところで遅くなって
いることがあります。たとえば「セルにデータを書き込む」という処理
は、そのセルの参照関係次第では、メチャメチャ時間がかかることが
あったりしますので。
    • good
    • 0

どれくらい時間がかかっているのかが分かりませんが、


どうしてもfor文でなくてはならないというのでなければ、
「フィルタオプション」をおすすめします。
    • good
    • 0

あまり詳しくないですが(実験していないので実際の効果はわかりませんが)


遅い原因が削除した後にその下のデータを動かす必要があるためと考えるなら、

・一旦配列に読み込んで、書き直すとか、
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …


・削除すべき列を特定して、Rangeの文字列を生成して、複数行を選択して
いっぺんに削除するとか、

で、早くなるような気がしますが、、、
    • good
    • 0

そんなに詳しくないけど、とりあえず


Sub Macro()
 Application.ScreenUpdating = False

 '内容

 Application.ScreenUpdating = True
End Sub
とした場合でも、遅いでしょうか?

この回答への補足

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

補足日時:2013/10/01 12:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!