Używam tego bardzo pomocnego forum przez chwilę, zawsze znaleźliśmy odpowiedzi na moje pytania. Jesteście najlepsi!

Ale tym razem nie mogę znaleźć rozwiązania tego, co powinno być prostą sprawą. Próbowałem kilku sugestii, ale nie działa ...

Chciałbym więc pobrać dwa raporty z innego oprogramowania za pomocą GUI. Ale czasami raport1 lub / i raport2 nie istnieją.

Sub Report_download()
    On Error Goto RP1_err
        'GUI codes to download Report(1)

    On Error Goto RP2_err
        'GUI codes to download Report(2)

    MsgBox "Both Reports downloaded."

    Exit Sub

RP1_err:
        If MsgBox("Report(1) not found. Proceed to Report(2) download?", 
vbYesNo) = vbNo Then Exit Sub
        On Error Resume Next
            'GUI codes to download Report(2)
        If Err.Number > 0 Then
        MsgBox "Neither Report(1) nor Report(2) Found"
        End If
    Exit Sub


RP2_err:
    MsgBox "Report(1) downloaded, Report(2) not found. Review manually."

    Exit Sub

End Sub

Kiedy uruchamiam to na przypadek, w którym istnieje żaden raport (1), ani raport (2) występuje, wystąpi błąd w "Kody GUI do pobierania raportu (2)" w ramach obsługi błędów RP1_ERR (jak powinien), po naciśnięciu "Tak . " Jednak następuje jednak, zamiast pokazywać komunikatu "ani raport (1), ani raport (2) znaleziono" pojawi się okno Dialog debugowania. Co ja robię źle?

Doceniam Twoją pomoc!

0
Michael 26 luty 2019, 12:27

2 odpowiedzi

Najlepsza odpowiedź

Odrzuciłbym swój kod coś w ten sposób:

Option Explicit

Sub Report_download()
    Dim blnSuccess1 As Boolean: blnSuccess1 = DownloadReport1
    Dim blnSuccess2 As Boolean: blnSuccess2 = DownloadReport2

    If blnSuccess1 = False And blnSuccess2 = False Then
        Debug.Print "Both reports failed to download"
    ElseIf blnSuccess1 = False And blnSuccess2 = True Then
        Debug.Print "Report 1 failed to download"
    ElseIf blnSuccess1 = True And blnSuccess2 = False Then
        Debug.Print "Report 2 failed to download"
    Else
        Debug.Print "Both reports successfully downloaded"
        ' Process the results
    End If
End Sub

Function DownloadReport1() As Boolean
    On Error GoTo ErrorHandler
    ' Your code to do the actual download 1, which may cause error
    On Error GoTo 0
    DownloadReport1 = True
    Exit Function
ErrorHandler:
    DownloadReport1 = False
End Function

Function DownloadReport2() As Boolean
    On Error GoTo ErrorHandler
    ' Your code to do the actual download 2, which may cause error
    On Error GoTo 0
    DownloadReport2 = True
    Exit Function
ErrorHandler:
    DownloadReport2 = False
End Function

W ten sposób łatwiej jest zrozumieć obsługę błędu, ponieważ musisz skupić się na jednym problemie tylko w każdej funkcji.

Ponadto debugowanie jest łatwiejsze, ponieważ możesz przejść do pliku do pobrania1 lub do pobrania2.

Ponadto jest bardziej elastyczny: możesz usunąć raport 1 i 2 lub dodać raport 3 znacznie łatwiejszy.

A później możesz mieć funkcje dla raportu 1, 2 i 3. Sub do pobierania raportu 1 i 2, a drugi do pobrania 1 i 3. W tym przypadku można uniknąć redundancji (dwukrotnie kodowania, aby pobrać raport 1).

0
z32a7ul 26 luty 2019, 13:36

Dziękujemy za wszystkie komentarze! Na podstawie twoich sugestii wymyśliłem szybką poprawkę

on Error goto -1

Które działało dobrze dla mojego przypadku. Potem poszedłem studiować, jak działa boolowskie i wymyśliło rozwiązanie. (Chociaż uważam, że moje kody są raczej obrzydliwe ...)

Szybka poprawka:

Sub Report_download()
    On Error Goto RP1_err
        'GUI codes to download Report(1)

    On Error Goto RP2_err
        'GUI codes to download Report(2)

        MsgBox "FVD reports downloaded."

        Exit Sub

RP1_err:
    AppActivate Application.Caption
    DoEvents
    If MsgBox("RP1 not found. Proceed to RP2?", vbYesNo) = vbNo Then Exit Sub
        On Error GoTo -1
        On Error GoTo VDC_err
        'GUI codes to download Report(2)

    Exit Sub

Both_err:
    AppActivate Application.Caption
    DoEvents
    MsgBox "No VDC report saved."

    Exit Sub

RP2_err:
    AppActivate Application.Caption
    DoEvents
    MsgBox "RP1 saved. RP2 not saved."

    Exit Sub

End Sub

boolean

Sub Test_RP_DL_Boolean()
Dim RP1_state As Boolean, RP2_state As Boolean

On Error Resume Next
       'codes to download Report(1)
        If Err.Number > 0 Then
        RP1_state = False
        Else
        RP1_state = True
        End If
        On Error GoTo 0

On Error Resume Next
        'codes to download Report(2)
        If Err.Number > 0 Then
        RP2_state = False
        Else
        RP2_state = True
        End If
        On Error GoTo 0

If ((RP1_state = True) And (RP2_state = False)) Then
MsgBox "RP1 saved. RP2 not saved"
End If

If ((RP1_state = False) And (RP2_state = True)) Then
MsgBox "RP1 not saved. RP2 saved."
End If

If ((RP1_state = False) And (RP2_state = False)) Then
MsgBox "No report found"
End If

If ((RP1_state = True) And (RP2_state = True)) Then
MsgBox "RP1 and RP2 saved."
End If


End Sub

Nie jestem pewien, czy to właśnie miałeś na myśli "używać boolean," niezależnie od tego, że było to doświadczenie w nauce. Dziękuję Ci!

Ponadto nie mogłem podzielić się moimi dokładnymi kodami dla GUI, ponieważ są one bardzo długie i mają jakieś wrażliwe dane, musiałbym przejść przez każdą linię, aby ich cenzurować. Przepraszam!

0
HulkYoda 26 luty 2019, 12:24