有没有一种方法可以在此IF语句中添加多个“ NOT”

时间:2019-01-18 11:27:32

标签: excel vba if-statement

嘿,聪明的人,

我希望我的问题的标题足够合适,我已尽力了^^

我尝试将A列到Z列的2行进行比较,并检查它们内部是否具有相同的模式。使用模式我的意思是,如果在第1行的A列中写入了任何内容,那么在第2行的A列中也必须写入一些内容。或者,两者都可以为空。

听起来很简单,但是只有在模式DOESNT匹配时才允许执行if语句:用A1编写的内容,而不用A2编写的内容。

我确定我只是使用一种复杂的方法,但是即使在搜索了问题之后,我也找不到合适的,简单的解决方案。

我确定这对你们来说是小菜一碟,但我只是想不出如何构造它。 (也许是特定于星期五的问题;))

(在代码中,我跳过了循环部分,因为我猜想它对于问题是不必要的)

                If Not (A1 = "" And A2 = "") Or Not (Not A1 = "" And Not A2 = "") Then
                    Boolean = False
                End If

6 个答案:

答案 0 :(得分:2)

简化您的布尔表达式表示它总是求值为true,因此这里存在问题。

布尔快速代数课程:

NOT(A AND B) = NOT(A) OR NOT(B)
NOT(A OR B) = NOT(A) AND NOT(B)

应用于表达式时,为了简单起见,将A1 = ""编写为A,将A2 = ""编写为B

  Not (A And B) Or Not (Not A And Not B)
= Not(A) Or Not(B) or Not(Not(A)) or Not(Not(B))
= Not(A) Or Not(B) or A or B
= True

我相信您的意思是这样的:

  Not((A and B) or (Not(A) and Not(B)))

这可能会简化,但这会损害可读性(要检查的内容变得不太明显)。

最后,您不应该这样写:

If Expression
    Boolean = False

但是:

Boolean = Not(Expression)

假设变量分配不是实际代码的占位符。

答案 1 :(得分:1)

Dim i As Long, result As Boolean
For i = 1 To 25
    If Cells(1, i).Value = Cells(2, i).Value Then
        result = True
    Else
        result = False
        Exit For
    End If
Next i

您可以根据自己的目的修改此代码,但是只要第一行和第二行中的列的值均不同,结果将为false,如果相等则为true。

列可以被视为字母或数字。

答案 2 :(得分:0)

我很难弄清楚该行代码要做什么,但这是我的看法。 仅当Boolean = False为空且A1不为空,或A2不为空而A1为空时,它才返回A2

If (A1 = "" and A2 <> "") OR (A1 <> "" and A2 = "") Then
    Boolean = False
End If

答案 3 :(得分:0)

您可以使用下面的公式来评估范围内的每个单元格是否为空。

=SUMPRODUCT(--(range<>""))=0

和类似的公式来检查每个单元格是否都为空:

=SUMPRODUCT(--(range=""))=0

并使用VBA应用该公式,否则将其用作普通的Excel公式。

来自此页面: https://exceljet.net/formula/all-cells-in-range-are-blank

答案 4 :(得分:0)

不是答案,但我的结论是您的陈述将始终为TRUE

enter image description here

一种略有不同的方法

Sub x()

Dim b As Boolean

b=(WorksheetFunction.CountBlank(Range("A1:A2")) <> 1)

End Sub

答案 5 :(得分:0)

关于我所了解的另一件事:

 if (A1<> "" and A2<>"") or  (A1= "" and A2="") then
     Boolean = False
 end if