VBA Excel If语句返回错误答案

VBA Excel If语句返回错误答案,excel,vba,Excel,Vba,我准备了if语句,用于检查特定行中的单元格。我有几个细胞,我必须检查。它们的值大多为“x”,但有时会有所不同。 问题是,即使其中一个值与“x”不同,我仍然会得到msgbox,根据我准备的代码,一切都很好 子审核检查() 如果范围(“C33,C39:C40,C43,C53:C54,C57:C59,C68”).Value=“x”或范围(“C33,C39:C40,C43,C53:C54,C57:C59,C68”).Value=“0”,则 '行(39)。删除 范围(“C58”)。激活“查看以防万一” M

我准备了if语句,用于检查特定行中的单元格。我有几个细胞,我必须检查。它们的值大多为“x”,但有时会有所不同。
问题是,即使其中一个值与“x”不同,我仍然会得到msgbox,根据我准备的代码,一切都很好

子审核检查()
如果范围(“C33,C39:C40,C43,C53:C54,C57:C59,C68”).Value=“x”或范围(“C33,C39:C40,C43,C53:C54,C57:C59,C68”).Value=“0”,则
'行(39)。删除
范围(“C58”)。激活“查看以防万一”
MsgBox(“一切都好!”)“如果是这样,我们可以隐藏X
ActiveSheet.Range(“$A$5:$IF$77”)。自动筛选字段:=1,标准1:=“x”,标准2:=“0”
其他的
MsgBox(“您必须更改定价!”)
如果范围(“C39”)。值为“x”,则为“C39情况
MsgBox(“安装风管上翻/上翻部分必须移除!”)
呼叫移除上行
调用新版本
如果结束
Exit Sub“宏终止,因为您必须更改价格
如果结束
端接头


有什么我在代码中没有提到的吗?

您必须使用
CountIf
对满足给定标准的范围内的单元格数进行计数,您可以这样做:

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

您必须使用
CountIf
,它将计算满足给定标准的范围内的单元格数,以便执行类似操作:

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

请尝试下一个代码:

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
子审核检查()
调暗sh作为工作表,rng作为范围,ar作为范围,countX作为长度,zCount作为长度
设置sh=ActiveSheet
设置rng=范围(“C33、C39:C40、C43、C53:C54、C57:C59、C68”)
对于每一个应收账款,在rng.区域内
countX=countX+工作表函数。CountIf(ar,“x”)
zCount=zCount+WorksheetFunction.CountIf(ar,“0”)
下一个
如果countX=rng.cells.count或zCount=rng.cells.count,那么“在这里,您可能需要将两个计数相加…”。。。
范围(“C58”)。激活“查看以防万一”
MsgBox(“一切都好!”)“如果是这样,我们可以隐藏X
ActiveSheet.Range(“$A$5:$IF$77”)。自动筛选字段:=1,标准1:=“x”,标准2:=“0”
其他的
MsgBox(“您必须更改定价!”)
如果范围(“C39”)。值为“x”,则为“C39情况
MsgBox(“安装风管上翻/上翻部分必须移除!”)
呼叫移除上行
调用新版本
如果结束
如果结束
端接头
检查计数的“x”或“0”看起来很奇怪。如果要将它们一起计数,应将它们与总范围单元格计数进行比较


如果计数零不再计数,您只需删除第二个条件。

请尝试下一个代码:

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
子审核检查()
调暗sh作为工作表,rng作为范围,ar作为范围,countX作为长度,zCount作为长度
设置sh=ActiveSheet
设置rng=范围(“C33、C39:C40、C43、C53:C54、C57:C59、C68”)
对于每一个应收账款,在rng.区域内
countX=countX+工作表函数。CountIf(ar,“x”)
zCount=zCount+WorksheetFunction.CountIf(ar,“0”)
下一个
如果countX=rng.cells.count或zCount=rng.cells.count,那么“在这里,您可能需要将两个计数相加…”。。。
范围(“C58”)。激活“查看以防万一”
MsgBox(“一切都好!”)“如果是这样,我们可以隐藏X
ActiveSheet.Range(“$A$5:$IF$77”)。自动筛选字段:=1,标准1:=“x”,标准2:=“0”
其他的
MsgBox(“您必须更改定价!”)
如果范围(“C39”)。值为“x”,则为“C39情况
MsgBox(“安装风管上翻/上翻部分必须移除!”)
呼叫移除上行
调用新版本
如果结束
如果结束
端接头
检查计数的“x”或“0”看起来很奇怪。如果要将它们一起计数,应将它们与总范围单元格计数进行比较


如果计数零不再计数,您只需删除第二个条件。

您正在查询多区域范围的
.Value
多区域范围的值
是其第一个区域的值。因此,您的条件实际上是
If Range(“C33”).Value=“x”或Range(“C33”).Value=“0”
。您必须使用
CountIf
,正如@Gserg刚才所说的
。Value
将返回该区域的第一个元素,请试一试。您能更好地解释(用文字)您想要实现的目标吗?您的代码无助于理解。是否希望代码只运行一次,并且如果两个区域中的任何单元格在第一个区域中为“x”,或在第二个区域中为“0”,则在缺少“x”或“0”的情况下执行某些操作或执行其他操作?或者只包含“x”或“0”…当代码中包含的单元格中至少有一个值不是“x”时,我希望执行“Else”条件。确定。但是,“0”呢?是否应计算
案例加
x
案例?您正在查询多区域范围的
多区域范围的值
是其第一个区域的值。因此,您的条件实际上是
If Range(“C33”).Value=“x”或Range(“C33”).Value=“0”
。您必须使用
CountIf
,正如@Gserg刚才所说的
。Value
将返回该区域的第一个元素,请试一试。您能更好地解释(用文字)您想要实现的目标吗?您的代码无助于理解。是否希望代码只运行一次,并且如果两个区域中的任何单元格在第一个区域中为“x”,或在第二个区域中为“0”,则在缺少“x”或“0”的情况下执行某些操作或执行其他操作?或者只包含“x”或“0”…当代码中包含的单元格中至少有一个值不是“x”时,我希望执行“Else”条件。确定。但是,“0”呢?
zero
cases加上
x
cases应该被计算吗?@chrisneilsen那么我猜他可以做
WorksheetFunction.CountIf(Range(“C33:C68”),NumCheck)=numberofxeexceptied
这样的例子:
Worksh