Обработка ошибок отладки для «Нет» и «Отмена» для Application.GetSaveAsFilename - PullRequest
0 голосов
/ 06 мая 2020

Я получаю сообщение об ошибке отладки, когда нажимаю «Нет» или «Отмена» для замены файла существующим в том месте, где я пытаюсь сохранить файл. Что мне здесь не хватает?

Sub ExportS()

Dim ws As Worksheet
Dim NewName As Variant
Dim sFileSaveName As Variant

    Set ws = Workbooks("PAP_Macro_v1.xlsm").Worksheets("Export by country")     
    NewName = ws.[H4]        

sFileSaveName = Application.GetSaveAsFilename(InitialFileName:=NewName, _
fileFilter:="Excel Workbook (*.xlsx), *.xlsx")

If sFileSaveName <> False Then
 ActiveWorkbook.SaveAs sFileSaveName
Else
MsgBox "File is not being saved, export failed!"
.Close SaveChanges:=False
End If


End Sub

1 Ответ

0 голосов
/ 06 мая 2020

Это не ошибка, это подсказка. Excel запрашивает, перезаписать ли существующий файл. Вы можете отключить это, выключив Application.DisplayAlerts (и снова включив, когда закончите!) - при выключенном DisplayAlerts существующий файл будет просто незаметно перезаписан - у пользователя не будет возможности отменить операцию.

Приглашение появляется во время выполнения метода SaveAs, и если вы отмените это приглашение, тогда Workbook.SaveAs потребуется способ сказать вызывающему: «Эй, подождите, нет, это не go, как планировалось. "- и возникает ошибка ... которую следует обрабатывать независимо от того, отменяет ли пользователь подсказку:

    If VarType(sFileSaveName) <> vbBoolean Then
        On Error GoTo CleanFail 'handle cancellation / other unexpected issues
        ActiveWorkbook.SaveAs sFileSaveName
        On Error GoTo 0
    Else
        MsgBox "File is not being saved, export failed!"
        ActiveWorkbook.Close SaveChanges:=False
    End If
CleanExit:
    Exit Sub
CleanFail:
    MsgBox "File was not saved."
    Resume CleanExit
End Sub

Любой код, связанный с доступом к файловой системе, всегда должен обрабатывать ошибки.

Тем не менее, Workbook.Close выглядит так, будто здесь отсутствует объект Workbook:

.Close SaveChanges:=False

Учитывая, что другая ветвь не работает ActiveWorkbook, по-видимому, это было намерением здесь, поскольку хорошо:

ActiveWorkbook.Close SaveChanges:=False

Рассмотрите возможность квалифицировать его более конкретным c объектом книги для более надежного кода.

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