プロが教える店舗&オフィスのセキュリティ対策術

VBA初心者です。

エクセルの表で、エラーがある行を削除し
同じ処理をシートの最後まで続けたいと思い、下記のコードを書きました。

Dim ws As Worksheet
Dim Rng As Range

For Each ws In ThisWorkbook.Worksheets

Application.ScreenUpdating = False
With ActiveSheet.UsedRange
On Error Resume Next
Set Rng = .SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0
If Not Rng Is Nothing Then
Rng.EntireRow.Delete
Application.ScreenUpdating = True
End If
Next
End Sub

実行すると【コンパイルエラー Nextに対するForがありません】
のエラーが出てしまいます。
どこを修正すればよいか、お知恵を拝借できますと幸いです。
何卒よろしくお願い申し上げます。

A 回答 (5件)

こんばんは


>コンパイルエラー Nextに対するForがありません
このエラーメッセージは まんま でない事があります

#1様が回答されているようなケース
(For~Next内で If With などに対して正しく閉じられていない場合)でも同じメッセージで表示されます
 For If With FalseやTrueなど対応する関係を考えると多分すっきりすると思います

On Error Resume Next についてはエラーセルが無い場合の1004エラー対策ですね

ご質問とは関係ないかもですが
ActiveSheet.UsedRangeについては シートをループしているので
With ws.UsedRangeなどとする必要があります
又はws.Activate ・・この方法はお勧めしませんが

さらに
Withを使用するメリットは無いように思いますので Withを外して
Set Rng = ws.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
で良いのでは無いでしょうか・・
以上を踏まえると

Dim ws As Worksheet
Dim Rng As Range
Application.ScreenUpdating = False
For Each ws In ThisWorkbook.Worksheets
On Error Resume Next
Set Rng = ws.UsedRange.SpecialCells(xlCellTypeFormulas, xlErrors)
On Error GoTo 0
If Not Rng Is Nothing Then
Rng.EntireRow.Delete
End If
Next
Application.ScreenUpdating = True
End Sub
のような処理になると思いますがデバッグして確認してみてください
    • good
    • 1
この回答へのお礼

ご丁寧にご教示頂き誠にありがとうございました。
まだ実現には至っていないのですが、初心者の自分にも
とても丁寧にご説明頂き、勉強になりました。
頂いた内容を踏まえて、またトライしております。
この度はありがとうございました。

お礼日時:2022/11/24 20:47

インデントを付けると分かり易いです。


他のところも修正しました。

Dim ws As Worksheet
Dim Rng As Range

Application.ScreenUpdating = False ' 移動しました
For Each ws In ThisWorkbook.Worksheets
  With ActiveSheet.UsedRange ' With ws.UsedRange では?
    On Error Resume Next
    Set Rng = .SpecialCells(xlCellTypeFormulas, xlErrors)
    On Error GoTo 0
    If Not Rng Is Nothing Then
      Rng.EntireRow.Delete
    End If
  ' ここに End With が必要
Next
Application.ScreenUpdating = True ' 移動しました
End Sub

Rng を 毎回初期化しなくて大丈夫かな?未確認。
    • good
    • 1
この回答へのお礼

ご丁寧に修正頂き誠にありがとうございました。
初心者にもわかりやすく修正内容を記載していただき、
またインデントもつけていただき、とても勉強になりました。

お礼日時:2022/11/24 20:50

#3です


サンプル考察で見落としました・・
1シート目にエラーがあり2シート目にエラーが無い場合・・
上手くいかないですね多分・・
対策としては次のシートに移る前にRngを初期化

If Not Rng Is Nothing Then 内を下記の様にします

If Not Rng Is Nothing Then
Rng.EntireRow.Delete
Set Rng = Nothing
End If
    • good
    • 1

End Subの1行上のNextを削除する。



対応するFor文が無いのだから要らない。

On Error Resume Nextの行き先じゃあ無いからね。
    • good
    • 1

End With



を入れてみてはどうだろうか。
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています