[[20210524171427]] 『VBAのCountifの使い方』(マロン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAのCountifの使い方』(マロン)

ファイル「A」のシートBのA列(A5から最終行)の中に「C」という文字が含まれていた場合、その行を削除するというコードを作りたいのですが、Countifの行で「オブジェクトが必要です」というエラーが出てしまいます。
間違っている箇所をご教授頂けますでしょうか?

Dim ws As Worksheet
Set ws = Workbooks("A").Worksheets("B")

Dim LR As Long
LR = ws.Cells(Rows.Count, "A").End(xlUp).Row

For i = 5 To LR
Cells(i, 1).Select

If WorksheetFunction.CountIf(Cells(i, 1).Value, "*C*") Then
Cells(i, 1).EntireRow.Delete
End if
Next i

< 使用 Excel:Office365、使用 OS:Windows10 >


 VBAのInStr関数を使用した方がよいと思うけど
Countif関数の第1引数はセル参照(Rangeオブジェクト)です
(Cells(i, 1).Valueだと値になります)
(はまちゃん) 2021/05/24(月) 17:34

既にコメントされていることに加えて、行を削除するとその分行全体が繰り上がるので、もし逐一削除していく処理で進めるなら【下から上】に向かって処理するのが鉄則です。
また、CountIf関数を使うのも悪くないですが、Like演算子を使い↓のような記述でも解決できます。
    Sub 始まりも終わりもないマクロ()
        Dim i As Long

        With Workbooks("A").Worksheets("B")
            For i = .Cells(.Rows.Count, "A").End(xlUp).Row To 5 Step -1
                If .Cells(i, 1).Value Like "*C*" Then
                    .Cells(i, 1).EntireRow.Delete
                End If
            Next i
        End With
    End Sub

ちなみに、対象セルを覚えておき、一括して削除するなら上からチェックでもOK
(逐一削除しない分、速度的には有利だが、 MyRNGに格納するセル範囲があまりにも細かく分かれているとちょっとマズイかも)

    Sub 別案()
        Dim i As Long
        Dim MyRNG As Range

        With Workbooks("A").Worksheets("B")
            For i = 5 To .Cells(.Rows.Count, "A").End(xlUp).Row Step 1
                If .Cells(i, 1).Value Like "*C*" Then
                    If MyRNG Is Nothing Then
                        Set MyRNG = .Cells(i, 1)
                    Else
                        Set MyRNG = Union(MyRNG, .Cells(i, 1))
                    End If
                End If
            Next i
        End With

        If Not MyRNG Is Nothing Then MyRNG.EntireRow.Delete
    End Sub

(もこな2 ) 2021/05/24(月) 18:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.