プロが教えるわが家の防犯対策術!

下記VBAは特定の行だけ取り出すために組んだマクロの一部ですが、
なぜか.Value Like "W*"の部分が実行されません、
ORの前と後ろを逆にするとやはり前だけしか実行されません。

どこが問題なのでしょうか?
また、"J*"か"W*"以外の行を削除するという文はどう書くのでしょうか?

よろしくお願いします。


For j = Range("A1").End(xlDown).Row To 2 Step -1
With Cells(j, "AB")

If Not .Value Like "J*" Or .Value Like "W*" Then
.EntireRow.Delete
End If

End With

Next j

A 回答 (3件)

>If Not .Value Like "J*" Or .Value Like "W*" Then


["J*"か"W*"以外の行を削除する]

これは、排他的論理積の内容ですね。
英米人は、何の問題もなく答えられるけれども、日本人などは、どうしても戸惑ってしまいます。英語には、こういう表現がありますが、日本語には、そういう表現があっても、言葉には正確に表す論理がありません。もし、本格的なプログラミングをおやりになるなら、是非、学ばれたほうがよいです。ベン図を書いて試してみるとよいです。

["J*"*か*"W*"以外の行を削除する]
「か=or(和)」が否定になると「and(積)」に変わると覚えていればよいです。

If Not (UCase(.Value) Like "J*" Or Not UCase(.Value) Like "W*" Then
または
If Not UCase(.Value) Like "J*" And Not UCase(.Value) Like "W*" Then

このように演算子が変わります。
    • good
    • 0

こんばんは!



せっかくコードをお考えなのですが、一気に削除する方法はどうでしょうか?
一例です。

Sub Sample1()
Dim i As Long, myStr As String, myRng As Range
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
myStr = Left(Cells(i, "AB"), 1)
If InStr("JW", myStr) = 0 Then
If myRng Is Nothing Then
Set myRng = Cells(i, "AB")
Else
Set myRng = Union(myRng, Cells(i, "AB"))
End If
End If
Next i
If Not myRng Is Nothing Then
myRng.EntireRow.Delete
End If
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0

>"J*"か"W*"以外の行を削除する



If Not(.Value Like "J*" And .Value Like "W*") Then

又は個別に

If Not .Value Like "J*" And Not .Value Like "W*" Then

ではないですかね?
⇒双方がTrueでない事が条件成立になるのでAndでしょうね。
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A