VBA Excel Если оператор возвращает неправильный ответ - PullRequest
0 голосов
/ 04 августа 2020

Я подготовил оператор if для проверки моих ячеек в указанной строке c. У меня есть несколько ячеек, которые я должен проверить. Их значения в основном «x», но иногда они меняются. Проблема в том, что даже если одно из значений отличается от «x», я все равно получаю сообщение о том, что все в порядке в соответствии с кодом, который я подготовил.

Sub AuditCheck()
    If Range("C33,C39:C40,C43,C53:C54,C57:C59,C68").Value = "x" Or Range("C33,C39:C40,C43,C53:C54,C57:C59,C68").Value = "0" Then
        'Rows(39).Delete
         Range("C58").Activate  'taking a look just in case
         MsgBox ("All good!") ' if so we can hide X
         ActiveSheet.Range("$A$5:$IF$77").AutoFilter Field:=1, Criteria1:="<>x", Criteria2:="<>0"
    Else
        MsgBox ("You have to change the pricing!")
        If Range("C39").Value <> "x" Then       'C39 CASE
            MsgBox ("Install duct Upturns/upturn section must be removed!")
            Call RemoveUpturn
            Call New_version_upturn
        End If
        Exit Sub   'the macro is terminated because you have to change the prices
    End If
End Sub

введите описание изображения здесь

Есть что-то, чего я не упомянул в коде?

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Попробуйте следующий код, пожалуйста:

Sub AuditCheck()
 Dim sh As Worksheet, rng As Range, ar As Range, countX As Long, zCount As Long
 Set sh = ActiveSheet
 Set rng = Range("C33,C39:C40,C43,C53:C54,C57:C59,C68")
   For Each ar In rng.Areas
    countX = countX + WorksheetFunction.CountIf(ar, "x")
    zCount = zCount + WorksheetFunction.CountIf(ar, "0")
   Next
   If countX = rng.cells.count Or zCount = rng.cells.count Then 'here, you maybe want adding the two counts...
       Range("C58").Activate  'taking a look just in case
       MsgBox ("All good!") ' if so we can hide X
       ActiveSheet.Range("$A$5:$IF$77").AutoFilter field:=1, Criteria1:="<>x", Criteria2:="<>0"
   Else
        MsgBox ("You have to change the pricing!")
        If Range("C39").Value <> "x" Then       'C39 CASE
            MsgBox ("Install duct Upturns/upturn section must be removed!")
            Call RemoveUpturn
            Call New_version_upturn
        End If
   End If
End Sub

Странно выглядит проверка подсчитанного «x» или «0». Если вы хотите посчитать их вместе, вы должны добавить их сравнение с общим количеством ячеек диапазона ...

Если подсчет нуля не считается (больше), вы просто удалите второе условие.

1 голос
/ 04 августа 2020

Вы должны использовать CountIf (здесь c) , который будет подсчитывать количество ячеек в диапазоне, который соответствует заданным критериям, чтобы вы сделали что-то вроде этого:

Sub Try_Me()
    Dim Myrng As Range
    Dim NumCheck as Long
    Dim StrCheck as String
    StrCheck = "x"
    NumCheck = 0
    Set Myrng = Range("C33,C39:C40,C43,C53:C54,C57:C59,C68")
    If WorksheetFunction.CountIf(Myrng, NumCheck ) = Myrng.Count Or WorksheetFunction.CountIf(Myrng, StrCheck ) = Myrng.Count Then  
        Range("C58").Activate  'taking a look just in case
        MsgBox ("All good!") ' if so we can hide X
        ActiveSheet.Range("$A$5:$IF$77").AutoFilter Field:=1, Criteria1:="<>x", Criteria2:="<>0"
    Else 
        MsgBox ("You have to change the pricing!")
        If Range("C39").Value <> "x" Then       'C39 CASE
            MsgBox ("Install duct Upturns/upturn section must be removed!")
            Call RemoveUpturn
            Call New_version_upturn
        End If
        Exit Sub   'the macro is terminated because you have to change the prices
    End If
End Sub

РЕДАКТИРОВАТЬ Согласно @ chris neilsen вы должны сделать, как показано ниже, поскольку CountIf не работает с несмежным диапазоном. Поэтому я предлагаю вам просто подсчитать количество X в вашем диапазоне, если оно совпадает с исключенным числом x или 0, условие if вернет true:

Sub Try_Me()
    Dim Myrng As Range
    Dim NumCheck as Long
    Dim StrCheck as String
    Dim NumExceptedX as Int
    Dim NumeExceptedZ
    NumExceptedX = 11
    NumeExceptedZ = 15
    StrCheck = "x"
    NumCheck = 0
    Set Myrng = Range("C33:C68")
    If WorksheetFunction.CountIf(Myrng, NumCheck ) = NumeExceptedZ  Or WorksheetFunction.CountIf(Myrng, StrCheck ) = NumExceptedX  Then  
        Range("C58").Activate  'taking a look just in case
        MsgBox ("All good!") ' if so we can hide X
        ActiveSheet.Range("$A$5:$IF$77").AutoFilter Field:=1, Criteria1:="<>x", Criteria2:="<>0"
    Else 
        MsgBox ("You have to change the pricing!")
        If Range("C39").Value <> "x" Then       'C39 CASE
            MsgBox ("Install duct Upturns/upturn section must be removed!")
            Call RemoveUpturn
            Call New_version_upturn
        End If
        Exit Sub   'the macro is terminated because you have to change the prices
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...