Обработка ошибок VBA при попытке открыть книгу - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь перебрать все файлы в папке, открыть их и удалить информацию о документе.У меня возникают проблемы при работе с файлами, которые не могут быть открыты или когда они открываются, всплывают сообщения об отключении макросов.Я попытался решить эту проблему, используя возобновление ошибки далее и переход к ошибке 0. Но затем я получаю сбой во время выполнения, потому что мой объект рабочей книги (wb) не был установлен, когда я пытался закрыть файлы, которые открылись.

Я прочитал документацию «При появлении ошибки далее» и «При ошибке перейти к 0», но я не верю, что я правильно их здесь использую.Спасибо за любую помощь, спасибо.

Option Explicit
Sub test_Scrubber_New()

Dim directory As String, fileName As String, i As Variant, wb As Workbook
Application.DisplayAlerts = False
Application.ScreenUpdating = False

'directory = "C:\Users\bayli\Desktop\Files for Testing\"
directory = "C:\Users\bayli\Desktop\excel files\"
fileName = Dir(directory & "*.xl??")

i = 0
Do While fileName <> ""
    On Error Resume Next
    Set wb = Workbooks.Open(directory & fileName)
    On Error GoTo 0
        'remove info
        ActiveWorkbook.RemoveDocumentInformation (xlRDIAll)
    wb.Close True
    i = i + 1
    fileName = Dir()
    Application.StatusBar = "Files Completed:  " & i
Loop

Application.StatusBar = False
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Complete"

End Sub

Я обновил свой код, добавив в него следующее: Если не wb, то ничегоОбновление ссылок.Если я нажимаю «Не обновлять», мой код продолжает работать по мере необходимости, но есть способ решить эту проблему.Я перебираю более 5 тыс. Файлов, так что вы можете себе представить, что это займет некоторое время.Время, которое уходит на это, не является проблемой, но в настоящее время я сижу здесь, и мне приходится несколько раз нажимать «не обновлять».Я думал, что Application.DisplayAlerts = False предотвратит эти всплывающие окна, однако это не так.

1 Ответ

0 голосов
/ 29 ноября 2018

ОК, здесь есть пара вопросов.Во-первых, что касается обработки ошибок.Когда вы используете встроенную обработку ошибок (On Error Resume Next), основной шаблон состоит в том, чтобы отключить автоматическую обработку ошибок, запустить строку кода, для которой вы хотите «перехватить» ошибку, а затем проверить, чтобы проверить, является ли Err.Number равно нулю:

On Error Resume Next
ProcedureThatCanError
If Err.Number <> 0 Then
    'handle it.
End If
On Error GoTo 0

Остальные вопросы касаются диалоговых окон, с которыми вы можете столкнуться при открытии рабочих книг.Большая часть этого задокументирована на странице MSDN для Workbook.Open, но вы захотите изменить свойство Application.AutomationSecurity, чтобы соответствующим образом обрабатывать запросы макросов.Для обновлений вы должны передать соответствующий параметр UpdateLinks.Я также рекомендовал бы указать IgnoreReadOnlyRecommended, Notify и CorruptLoad.Нечто подобное должно сработать (не проверено) или, по крайней мере, приблизить вас:


Sub TestScrubberNew() 'Underscores should be avoided in method names.

    Dim directory As String, fileName As String, i As Variant, wb As Workbook
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    Dim security As MsoAutomationSecurity
    security = Application.AutomationSecurity
    Application.AutomationSecurity = msoAutomationSecurityForceDisable

    directory = "C:\Users\bayli\Desktop\excel files\"
    fileName = Dir(directory & "*.xl??")

    i = 0
    Do While fileName <> vbNullString
        On Error Resume Next
        Set wb = Workbooks.Open(fileName:=directory & fileName, _
                                UpdateLinks:=0, _
                                IgnoreReadOnlyRecommended:=True, _
                                Notify:=False, _
                                CorruptLoad:=xlNormalLoad)
        If Err.Number = 0 And Not wb Is Nothing Then
            On Error GoTo 0
            wb.RemoveDocumentInformation xlRDIAll
            wb.Close True
            i = i + 1
            Application.StatusBar = "Files Completed:  " & i
            fileName = Dir()
        Else
            Err.Clear
            On Error GoTo 0
            'Handle (maybe log?) file that didn't open.
        End If
    Loop

    Application.AutomationSecurity = security
    Application.StatusBar = False
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "Complete"

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