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

特定の文字列が複数あって、その文字列があったときに行ごと削除を行いたくこちらのサイトで下記をみつけ、上手くいったのですが意味がわかりません。 解説をお願いします。


Sub Sample()
Dim i As Long, k As Long
Dim myRng As Range
Dim myary
myary = Array("赤", "青", "紫")
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
For k = 0 To UBound(myary)
If Cells(i, "A") = myary(k) Then
If myRng Is Nothing Then
Set myRng = Cells(i, "A")
Else
Set myRng = Union(myRng, Cells(i, "A"))
End If
Exit For
End If
Next k
Next i
If Not myRng Is Nothing Then
myRng.EntireRow. Delete
End If
End Sub

A 回答 (3件)

こんばんは!



まず上記コードの
>myRng.EntireRow. Delete

>myRng.EntireRow.Select
に変更してみてください。
該当行が選択されているのが判ると思います。

さて、コードの説明ですが、
① 配列に「赤、青、紫」の順に格納しています。
配列のINDEX順は 0 1 2 ・・・
と最初は「1」ではなく、「0」から始まります。
なので
>For k = 0 To UBound(myary) (←今回は 0~2 までのループになります)

そして、A列データが配列に格納したデータを一致したセルを「myRng」に格納していく訳ですが、その際にUnionメソッドを使っています。

Unionメソッドですが、
何らかのRangeがセットされていないとエラーになりますので、まず
>If myRng Is Nothing Then
>Set myRng = Cells(i, "A")

のように最初にヒットしたセルを一旦セットし、次に
>Else
>Set myRng = Union(myRng, Cells(i, "A"))
でA列の該当セルをmyRngに次々セットしているコードです。

>If Not myRng Is Nothing Then
は単にエラー処理で該当セルが一つもない場合のエラーを回避しています。


>myRng.EntireRow. Delete

>myRng.Select
に変更してみると該当するA列だけが選択されているのが判ると思います。

※ おそらく当方が投稿したコードのような気がしたので
以上のような説明を投稿してみました。m(_ _)m
    • good
    • 1
この回答へのお礼

助かりました

そうです、こちらで見たコードを使用させていただき上手く行きました。ありがとうございます。
またわかりやすく解説して頂き助かりました。

お礼日時:2020/10/06 11:29

こんにちは



お使いになっているコードは、
>『特定の文字を含むセル以外行ごと削除』
とは、かなりかけ離れた処理内容になっていると思いますが、はたしてそれで大丈夫なんでしょうか?
    • good
    • 0

「特定の文字を含むセル以外を行ごと削除する」


「特定の文字列が・・・あったときに行ごと削除」
どっちが正解?

さて、本題です。
このコードのすべてが、全然、さっぱり、まるっきり、分かんないんですか?
それとも、大体は分かるけど、一部分が分からないのですか?
前者であれば、すいませんが、パスです。
後者であれば、どの辺の命令が分からないのか、補足してください。
    • good
    • 0

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