Выход для каждого L oop при отмене диалогового окна «Сохранить» - PullRequest
1 голос
/ 06 марта 2020

Я новичок в VBA и, как часть моей собственной разработки, в настоящее время я переписываю некоторую автоматизацию, которую я написал для завершения около 6+ месяцев go. У меня есть код ниже, который определяет имя листа на основе того, на каком листе нажата кнопка (есть два разных имени листа, похожих на CustName_CALC и две кнопки). Затем он просматривает оставшиеся листы в книге, чтобы найти «похожие» листы.

Приведенный ниже подпункт PDF_Bill() применяется к ранее упомянутым кнопкам:

Public vPDFilename As Variant
Public wb As Workbook
Public ws As Worksheet
Public wsBill As Worksheet
Public wsCalc As Worksheet
Public wsStatement As Worksheet
Public sLocation As String, sCustName As String, myTitle As String, myMsg As String, InitialFileName As String, Response As String, C_Response As String

Sub PDF_Bill()

sCustName = Left(ActiveSheet.Name, InStr(ActiveSheet.Name, "_") - 1)

Set wb = ThisWorkbook
Set wsCalc = wb.Sheets(sCustName & "_CALC")

myTitle = "Save Invoice"
myMsg = "Are you sure you would like to save the " & wsCalc.Cells(1, 2).Value2 & " invoice?"
Response = MsgBox(myMsg, vbQuestion + vbOKCancel, myTitle)
Select Case Response
    Case Is = vbOK

For Each wsBill In ThisWorkbook.Worksheets
        If wsBill.Name Like sCustName & "_BILL" & "*" Then
                    Call Module1_PDF.PDF_Procedure
        End If       
    Next wsBill

    Case Is = vbCancel
        'user cancels the first popup message
        myTitle = "Invoice Cancelled!"
        myMsg = "You've cancelled the request to save the invoice!"
        C_Response = MsgBox(myMsg, vbOKOnly, myTitle)

End Select
End Sub

Вышеуказанное вызывает это:

Sub PDF_Procedure()

sCustName = Left(ActiveSheet.Name, InStr(ActiveSheet.Name, "_") - 1)
sLocation = "S:DRIVELOCATION" & wsCalc.Cells(1, 2).Value2 & "\Invoices\"

vPDFilename = Application.GetSaveAsFilename( _
InitialFileName:=sLocation _
                    & wsCalc.Cells(1, 2).Value2 _
                    & " " _
                    & MonthName(Month(Date)) _
                    & " Invoice", _
FileFilter:="PDF, *.pdf", _
Title:="Save as PDF")

If vPDFilename <> False Then
    With wsBill
        '.Visible = xlSheetVisible '[will be hidden at later state]
        '.Activate
        'predefined area for 5 page invoice - this may need to change in future.
        .PageSetup.PrintArea = "A1:S300"
    End With

    'creates the PDF
    wsBill.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=vPDFilename, _
    OpenAfterPublish:=False

    'wsBill.Visible = xlSheetHidden 'bill sheet HIDE [WILL BE USED LATER NOT SET UP]
    Else
      'if user cancels save dialog box
      myTitle = "Invoice Cancelled!"
      myMsg = "You've cancelled the request to save the invoice!"
      C_Response = MsgBox(myMsg, vbOKOnly, myTitle)
      wsCalc.Activate
      GoTo CancelProcess    
End If
CancelProcess:
Exit Sub
End Sub

Код выше (за исключением из GoTo CancelProcess, потому что это то, с чем я борюсь) отлично работает для одного листа под названием CustName_Bill, но мне также нужно, чтобы он работал для сценария ниже.

Я просмотрел следующие страницы и более без успеха:

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

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

  • CustName_Bill_Type
  • CustName_Bill_Type1

l oop продолжается на следующем листе ie CustName_Bill_Type1, когда пользователь отменяет Application.GetSaveAsFilename но мне нужно for each l oop для выхода, когда пользователь отменяет диалоговое окно first Application.GetSaveAsFilename.

Итак, мой вопрос, куда мне поместить exit, чтобы код полностью завершился, как только пользователь нажмет «Отмена» в диалоговом окне first save.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

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

Function PDF_Procedure() as Boolean

    sCustName = Left(ActiveSheet.Name, InStr(ActiveSheet.Name, "_") - 1)
    sLocation = "S:DRIVELOCATION" & wsCalc.Cells(1, 2).Value2 & "\Invoices\"

    vPDFilename = Application.GetSaveAsFilename( _
    InitialFileName:=sLocation _
                        & wsCalc.Cells(1, 2).Value2 _
                        & " " _
                        & MonthName(Month(Date)) _
                        & " Invoice", _
    FileFilter:="PDF, *.pdf", _
    Title:="Save as PDF")

    If vPDFilename <> False Then
        With wsBill
            '.Visible = xlSheetVisible '[will be hidden at later state]
            '.Activate
            'predefined area for 5 page invoice - this may need to change in future.
            .PageSetup.PrintArea = "A1:S300"
        End With

        'creates the PDF
        wsBill.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=vPDFilename, _
        OpenAfterPublish:=False

        ' return true if saved
        PDF_Procedure = True   
        'wsBill.Visible = xlSheetHidden 'bill sheet HIDE [WILL BE USED LATER NOT SET UP]
    Else
        'if user cancels save dialog box
        myTitle = "Invoice Cancelled!"
        myMsg = "You've cancelled the request to save the invoice!"
        C_Response = MsgBox(myMsg, vbOKOnly, myTitle)
        wsCalc.Activate

        'return false if cancelled
        PDF_Procedure = False   
    End If

End Function

и добавили условие к вашему подпрограмме PDF_Bill

For Each wsBill In ThisWorkbook.Worksheets
    If wsBill.Name Like sCustName & "_BILL" & "*" Then
        If Module1_PDF.PDF_Procedure() = False Then
            Exit sub
        End if
    End If       
Next wsBill
0 голосов
/ 06 марта 2020

Ну, потратив еще несколько часов на изучение этого и большего количества испытаний, я понял это!

Переместил GoTo из подпункта PDF_Procedure() в PDF_Bill() sub и добавил логическое значение bCancelled

bCancelled = false
For Each wsBill In ThisWorkbook.Worksheets
     If bCancelled = True Then GoTo CancelProcess
        If wsBill.Name Like sCustName & "_BILL" & "*" Then
                    Call Module_PDF.PDF_Procedure
        End If
    Next wsBill

'Call Module_CopyData.StatementData 'copy bill info to wsStatement

    Case Is = vbCancel
        'user cancels the first popup message
        myTitle = "Invoice Cancelled!"
        'myMsg = "You've cancelled the request to save the invoice!"
        myMsg = "Select Case"
        C_Response = MsgBox(myMsg, vbOKOnly, myTitle)
End Select

CancelProcess:
 If bCancelled = True Then
    'if user cancels save dialog box
    myTitle = "Invoice Cancelled!"
    'myMsg = "You've cancelled the request to save the invoice!"
    myMsg = "CancelProcess"
    C_Response = MsgBox(myMsg, vbOKOnly, myTitle)
    wsCalc.Activate

И в подпункте `PDF_Procedure ()

If vPDFilename <> False Then
    With wsBill
        .Visible = xlSheetVisible
        '.Activate
        'predefined area for 5 page invoice - this may need to change in future.
        .PageSetup.PrintArea = "A1:S300"
    End With

    'creates the PDF
    wsBill.ExportAsFixedFormat _
    Type:=xlTypePDF, _
    Filename:=vPDFilename, _
    OpenAfterPublish:=False
    'wsBill.Visible = xlSheetHidden 'bill sheet HIDE

    Else
        bCancelled = True

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