Функция VBA Работает при однократном запуске, но безуспешно при последовательных попытках - PullRequest
0 голосов
/ 16 марта 2020

У меня есть функция VBA в соответствии с кодом ниже:

Function stageValueVariance(stage As String, valCol As Long)
    On Error Resume Next
    For i = 2 To offlineHeight
        If Application.VLookup(offline.ListColumns(1).Range(i).value, bce.DataBodyRange, valCol, 0) <> offline.ListColumns(valCol).Range(i).value Then
            If oldOut.ListRows.Count <> 0 Then
                foundID = Application.WorksheetFunction.Match(offline.ListColumns(1).Range(i), oldOut.ListColumns(1).DataBodyRange, 0)
                If foundID <> 0 Then
                    oldOutPresent = True
                End If
            ElseIf valComp.ListRows.Count <> 0 Then
                foundID = Application.WorksheetFunction.Match(offline.ListColumns(1).Range(i), valComp.ListColumns(1).DataBodyRange, 0)
                If foundID <> 0 Then
                    valCompPresent = True
                End If
            End If
            If oldOutPresent = False And valCompPresent = False Then
                With stageValComp.ListRows.Add
                    .Range(1) = offline.ListColumns(1).Range(i)
                    .Range(2) = offline.ListColumns(2).Range(i)
                    .Range(3) = stage
                    .Range(4) = offline.ListColumns(7).Range(i)
                    .Range(5) = Application.VLookup(offline.ListColumns(1).Range(i).value, bce.DataBodyRange, valCol, 0)
                    .Range(6).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="Yes, No"
                End With
            End If
            foundID = 0
            oldOutPresent = True
            valCompPresent = True
        End If
    Next i
End Function

И я вызываю его в макросе, используя следующее:

'find stage value variances and populate data
    Call stageValueVariance("Design", 7)
    Call stageValueVariance("Guides", 9)
    Call stageValueVariance("Lintels", 11)
    Call stageValueVariance("Install", 13)

Макрос ищет отклонения в две таблицы, а переменная valCol задает столбец для поиска. Если найдено отклонение между offline и bce (две таблицы), то строка добавляется в третью таблицу - stageValComp.

Функция также проверяет, что идентификатор этой строки еще не присутствует в двух других таблицах - oldOut и valComp. Все переменные объявлены на уровне Publi c и установлены в макросе, который вызывает эту функцию.

Проблема, с которой я сталкиваюсь, - это когда я открываю книгу и запускаю макрос в первый раз, затем код находит отклонение и добавляет детали к stageValComp. Для каждой последующей попытки выполнить код отклонение не найдено. Однако, если я пошагово выполняю код с помощью F8, код работает правильно и находит отклонение.

Я никогда раньше не сталкивался с этим типом ошибок, поэтому я немного озадачен! Любая помощь будет оценена!

1 Ответ

0 голосов
/ 16 марта 2020

Оказывается, это потому, что я установил oldOutPresent и valCompPresent на True после оператора If, когда я должен был установить его обратно на False. Правильный код (который сейчас работает!):

Function stageValueVariance(stage As String, valCol As Long)
    On Error Resume Next
    For i = 2 To offlineHeight
        If Application.VLookup(offline.ListColumns(1).Range(i).value, bce.DataBodyRange, valCol, 0) <> offline.ListColumns(valCol).Range(i).value Then
            If oldOut.ListRows.Count <> 0 Then
                foundID = Application.Match(offline.ListColumns(1).Range(i), oldOut.ListColumns(1).DataBodyRange, 0)
                If foundID <> 0 Then
                    oldOutPresent = True
                End If
            ElseIf valComp.ListRows.Count <> 0 Then
                foundID = Application.Match(offline.ListColumns(1).Range(i), valComp.ListColumns(1).DataBodyRange, 0)
                If foundID <> 0 Then
                    valCompPresent = True
                End If
            End If
            If oldOutPresent = False And valCompPresent = False Then
                With stageValComp.ListRows.Add
                    .Range(1) = offline.ListColumns(1).Range(i)
                    .Range(2) = offline.ListColumns(2).Range(i)
                    .Range(3) = stage
                    .Range(4) = offline.ListColumns(valCol).Range(i)
                    .Range(5) = Application.VLookup(offline.ListColumns(1).Range(i).value, bce.DataBodyRange, valCol, 0)
                    .Range(6).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="Yes, No"
                End With
            End If
            foundID = 0
            oldOutPresent = False
            valCompPresent = False
        End If
    Next i
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...