Есть ли способ сложить несколько «НЕ» в этом заявлении IF - PullRequest
0 голосов
/ 18 января 2019

Привет, умные люди,

Надеюсь, название моего вопроса достаточно подходит, я старался изо всех сил ^^

Я пытаюсь сопоставить 2 строки от столбца A до Z и проверить, имеют ли они одинаковый шаблон внутри. Под шаблоном я подразумеваю, что если в строке 1 столбца A что-либо записано, то в строке 2 столбца A также должно быть что-то записанное. В противном случае оба могут быть пустыми.

Звучит просто, но оператор If разрешается выполнять только в том случае, если шаблон НЕ соответствует: что-то записано в A1 и ничего не записано в A2.

Я уверен, что я использую только сложный метод, но даже после поиска в поиске проблемы я не могу найти подходящее, простое решение.

Я уверен, что для вас это просто кусок пирога, но я просто не могу понять, как его структурировать. (возможно, пятничный вопрос;))

(В коде я пропустил часть цикла, так как думаю, что она не нужна для проблемы)

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

Ответы [ 6 ]

0 голосов
/ 18 января 2019

Еще один о том, что я понимаю:

 if (A1<> "" and A2<>"") or  (A1= "" and A2="") then
     Boolean = False
 end if
0 голосов
/ 18 января 2019

Не ответ, но я пришел к выводу, что ваше утверждение всегда будет оцениваться в ИСТИНА

enter image description here

Несколько иной подход

Sub x()

Dim b As Boolean

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

End Sub
0 голосов
/ 18 января 2019

Упрощение вашего логического выражения показывает, что оно всегда равно 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)

Предполагается, что присвоение переменной не является заполнителем для фактического кода.

0 голосов
/ 18 января 2019
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

Вы можете изменить этот код для своих целей, но всякий раз, когда столбец имеет различное значение как в первой, так и во второй строке, результат будет ложным и истинным, если они равны.

Столбцы можно рассматривать как буквы или цифры.

0 голосов
/ 18 января 2019

Вы можете использовать формулу, подобную приведенной ниже, чтобы оценить, является ли каждая ячейка диапазона пустой.

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

и аналогичная формула, чтобы проверить, не является ли каждая ячейка не пустой:

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

и примените формулу, используя VBA, или как обычную формулу Excel.

взято с этой страницы: https://exceljet.net/formula/all-cells-in-range-are-blank

0 голосов
/ 18 января 2019

Я с трудом пытаюсь понять, что вы хотите сделать с этой строкой кода, но вот мой шанс.Он вернет Boolean = False, только если A1 пусто, а A2 нет, или A1 не пусто, но A2 равно.

If (A1 = "" and A2 <> "") OR (A1 <> "" and A2 = "") Then
    Boolean = False
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...