ИЛИ использование оператора в VBA - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь понять, как использовать оператор Or в VBA. Я не очень знаком с этим языком, который вы могли бы сказать.

Следующая часть кода работает просто отлично:

FirstRow = 2
LastRow = Cells(Rows.Count, "K").End(xlUp).Row - 1
For r = LastRow To FirstRow Step -1
If Cells(r, "K") <> 114 Then
    Rows(r).Delete
End If
Next r

Удаляет строки, не содержащие числа 114. Проблема в том, что я хочу также включить числа 136 и 139. Я хочу сохранить только строки, содержащие 114, 136 или 139 в столбце K (плюс заголовок и итоговая строка).

Я пробовал несколько похожих на:

FirstRow = 2
LastRow = Cells(Rows.Count, "K").End(xlUp).Row - 1
For r = LastRow To FirstRow Step -1
If Cells(r, "K") <> 114 Or _
   Cells(r, "K") <> 136 Or _
   Cells(r, "K") <> 139 Then
   Rows(r).Delete
End If
Next r

Эти коды просто удаляют все, кроме заголовков и итоговой строки.

Что я делаю не так?

Полный код:

Sub SouthEast()
    Dim answer As Integer
    answer = MsgBox("Continue?", vbYesNo + vbQuestion, "Show only South East")
    If answer = vbYes Then
        Dim r As Long
        Dim FirstRow As Long
        Dim LastRow As Long

        FirstRow = 2
        LastRow = Cells(Rows.Count, "K").End(xlUp).Row - 1
        For r = LastRow To FirstRow Step -1
        If Cells(r, "K") <> 114 Or _
            Cells(r, "K") <> 136 Or _
            Cells(r, "K") <> 139 Then
            Rows(r).Delete
        End If
        Next r
    Else
        'Do nothing        
End If
End Sub

Ответы [ 4 ]

3 голосов
/ 14 марта 2019

В этом случае вам нужно использовать оператор And, например:

If Cells(r, "K") <> 114 And _
   Cells(r, "K") <> 136 And _
   Cells(r, "K") <> 139 Then
   Rows(r).Delete
End If

Если бы вы проверяли равенство, вы бы использовали Or.

Как это:

If Cells(r, "K") = 114 Or _
   Cells(r, "K") = 136 Or _
   Cells(r, "K") = 139 Then
   Rows(r).Delete
End If
2 голосов
/ 14 марта 2019

Использование And

Or вызовов TRUE, если любое значений истинно

And вызовов TRUE, если все из значений верны

Sub SouthEast()
    Dim answer As Integer
    answer = MsgBox("Continue?", vbYesNo + vbQuestion, "Show only South East")
    If answer = vbYes Then
        Dim r As Long
        Dim FirstRow As Long
        Dim LastRow As Long

        FirstRow = 2
        LastRow = Cells(Rows.Count, "K").End(xlUp).Row - 1
        For r = LastRow To FirstRow Step -1
        If Cells(r, "K") <> 114 And _
            Cells(r, "K") <> 136 And _
            Cells(r, "K") <> 139 Then
            Rows(r).Delete
        End If
        Next r
    Else
        'Do nothing        
End If
End Sub
2 голосов
/ 14 марта 2019

Это типичная логическая ошибка: вы говорите о:

Not(
 (value == 114) OR
 (value == 136) OR
 (value == 139))

Это равно:

Not(value == 114) AND
Not(value == 136) AND
Not(value == 139)

Что равно:

(value <> 114) AND
(value <> 136) AND
(value <> 139)
0 голосов
/ 14 марта 2019

Мой ответ аналогичен приведенному выше, но я хочу подчеркнуть некоторые детали.

  1. Лучше использовать Option Explicit , чтобы избежать ошибок объявления.
  2. Лучше четко указать лист и диапазон, с которым вы работаете.
  3. На мой взгляд, лучше использовать .value

    Option Explicit
    
    Sub SouthEast()
    
        Dim answer As Integer
        Dim r As Long, FirstRow As Long, LastRow As Long
    
        answer = MsgBox("Continue?", vbYesNo + vbQuestion, "Show only South East")
    
        If answer = vbYes Then
    
            With ThisWorkbook.Worksheets("Sheet1")
    
                FirstRow = 2
                LastRow = .Cells(.Rows.Count, "K").End(xlUp).Row - 1
    
                For r = LastRow To FirstRow Step -1
    
                    If .Cells(r, "K").Value <> 114 And _
                        .Cells(r, "K").Value <> 136 And _
                        .Cells(r, "K").Value <> 139 Then
                        .Rows(r).Delete
                    End If
    
                Next r
    
            End With
        Else
            'Do nothing
        End If
    
    End Sub
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...