Оператор If становится равным True, даже если функция возвращает False - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть электронная таблица с некоторыми VBA. Он предлагает пользователю выбрать электронную таблицу с помощью файлового браузера. Электронная таблица, которую выбирает пользователь, содержит длинный список элементов в строках, некоторые из которых повторяются. Каждый элемент имеет несколько атрибутов в соседних столбцах.

Код принимает каждый элемент, объединяет атрибуты и создает новый лист без дубликатов элементов и атрибутов.

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

В основной процедуре я нахожу столбцы, с которыми я работаю, и перебираю выбранную пользователем электронную таблицу с циклом for. С каждой итерацией я вызываю функцию doesNotExist(). Эта функция принимает имя элемента в качестве параметра и будет перебирать все элементы на новом листе, чтобы увидеть, существует ли этот элемент на новом листе. Если элемент не существует на новом листе, он возвращает True. В противном случае возвращается False.

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

Я использовал много окон сообщений, чтобы увидеть, что именно делает мой код. Функция всегда правильно оценивает данные. Однако код внутри оператора If всегда будет выполняться независимо от возвращаемого значения.

Я даже добавил Else к моему оператору if с окном сообщения. Это окно сообщения никогда не открывается, даже когда моя функция возвращает значение false.

Function doesNotExist(itemName As String, itemP As String, arSheet As Worksheet) As Boolean
    'iterates through all items on the PO. Checks to see if item defined in param exists in PO

    For i = 17 To (arSheet.Range("itemCount") + 17)
        If ((StrComp(arSheet.Cells(i, 4), itemName)) = 0) Then
            If ((StrComp(arSheet.Cells(i, 7), itemP)) = 0) Then
                doesNotExist = False
            End If
        End If
    Next i

    doesNotExist = True
End Function
If (doesNotExist(wb2.Worksheets(1).Cells(i, itemName.Column), wb2.Worksheets(1).Cells(i, itemP.Column), ar)) Then
    ~code~
Else
    MsgBox ("I did not print " & wb2.Worksheets(1).Cells(i, skuName.Column))
End If

1 Ответ

4 голосов
/ 05 апреля 2019

Вам необходимо выйти из функции, когда вы достигли значения false ...

Function doesNotExist(itemName As String, itemP As String, arSheet As Worksheet) As Boolean
    'iterates through all items on the PO. Checks to see if item defined in param exists in PO

    For i = 17 To (arSheet.Range("itemCount") + 17)
        If ((StrComp(arSheet.Cells(i, 4), itemName)) = 0) Then
            If ((StrComp(arSheet.Cells(i, 7), itemP)) = 0) Then
                Exit Function
            End If
        End If
    Next i

    doesNotExist = True
End Function

Установка возвращаемого значения в VBA не возвращается из функции, как другие языки.

Кроме того, вам не нужно устанавливать значение в false, это возвращаемое значение по умолчанию, если вы не установите его в true, поэтому я удалил строку, в которой вы устанавливаете возвращаемое значение в false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...