Как мне обработать ошибку после функции соответствия - PullRequest
0 голосов
/ 28 мая 2020

есть ли способ обработать ошибку в цикле. Я использую функцию сопоставления, чтобы сопоставить коттедж с правильным размером и классом, поскольку он зарезервирован. Но если нет доступного cottage_size, функция сопоставления возвращает ошибку, после чего я хочу обновить коттедж (cottage_size = cottage_size + 1) и снова найти совпадение ..
Мой вопрос: как мне go вернуться к функции соответствия после ошибки и после того, как я обновил размер ..

 If som = 0 And iDklasse = class And iDpers = cottage_size Then


                        Set klasseKolom = cottagesheet.UsedRange.Columns(3)
                        Set SizeKolom = cottagesheet.UsedRange.Columns(2)

                        For k = 4 To 1 Step -1
                            For p = 2 To 12

                                cottageId = (Evaluate("MATCH(1,(" & klasseKolom.Address(External:=True) & "=" & zoekklasse & ")*(" & SizeKolom.Address(External:=True) & "=" & cottage_size & "),0)"))
                                If Not IsError(cottageId) Then
                                huisnr = cottageId
                                    If Application.CountIf(validatorsheet.Range("B:B"), huisnr) = 0 Then                               'cottage beschikbaarheid (gaat niet goed)
                                        validatorsheet.Cells(iD, 2).Value = cottagesheet.Cells(cottageId, 1).Value                      'invullen in validatorsheet
                                        stay = Reservationsheet.Cells(iD, 3).Value
                                        arrival_date = Reservationsheet.Cells(iD, 2).Value
                                        For datumkolom = 2 To laatstekolom
                                            If arrival_date = roostersheet.Cells(1, datumkolom).Value Then
                                                 'If Application.CountBlank(Range(roostersheet.Cells(huisnr, datumkolom), roostersheet.Cells(huisnr, datumkolom + stay - 1))) = Range(roostersheet.Cells(huisnr, datumkolom), roostersheet.Cells(huisnr, datumkolom + stay - 1)).Cells.Count Then

                                                    Range(roostersheet.Cells(huisnr, datumkolom), roostersheet.Cells(huisnr, datumkolom + stay - 1)).Value = Reservationsheet.Cells(iD, 1).Value
                                                End If
                                            'End If
                                        Next datumkolom
                                    End If
                                ElseIf IsError(cottageId) Then zoekklasse = zoekklasse + k And cottage_size = cottage_size + p And klasseKolom = klasseKolom + k And SizeKolom = SizeKolom + p
                                                    cottageId = (Evaluate("MATCH(1,(" & klasseKolom.Address(External:=True) & "=" & zoekklasse & ")*(" & SizeKolom.Address(External:=True) & "=" & cottage_size & "),0)"))
                                                    huisnr = cottageId                  'indien er geen match is??
                                End If
                            Next p
                        Next k

заранее спасибо

1 Ответ

3 голосов
/ 28 мая 2020

Обычно для запуска функций рабочего листа вы должны использовать WorksheetFunction API.

Early-bound, Application.WorksheetFunction.Match дает вам проверку времени компиляции и идиоматические c ошибки времени выполнения VBA в случае несоответствия (т.е. вы можете обработать несоответствие с помощью оператора On Error).

Late-bound, Application.Match теряет проверку времени компиляции, но теперь вы получаете результат Variant/Error вместо ошибки времени выполнения VBA в случае несоответствие.

Используя версию с поздним связыванием, вам нужно будет подтвердить, что результат можно использовать, прежде чем использовать его. Стандартная библиотечная функция IsError возвращает true с аргументом Variant/Error, поэтому здесь:

If IfError(cottageId) Then
    '...
End If

Попробуйте изменить его на:

If IsError(cottageId) Then
    '...
End If

Это делает ваш поток управления выглядит примерно так:

For i = 1 To iterations
    Dim result As Variant
    result = Evaluate("complicated Excel formula string")
    If Not IsError(result) Then
        'TODO process valid result here
        Exit For 'we're done, no need to keep looping
    End If
Next

Рассмотрите возможность прислушаться к совету Даррена хотя: кажется, Range.Find может быть здесь лучшим инструментом. L oop logi c остается прежним: последнее, что вам нужно, это GoTo -прыгать и увеличивать i до тех пор, пока счетчик не переполнит свой тип данных - с помощью For l oop вы можете ограничить максимум количество попыток, сверх которого вы просто должны признать, что не нашли совпадения для данного cottage_size; Range.Find / Range.FindNext есть механизмы, которые уже реализуют это за вас.

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