Workbooks.Open не использует предоставленный пароль, а запрашивает пароль у пользователя - PullRequest
0 голосов
/ 07 января 2020

Я открываю целую кучу книг, которые имеют один и тот же пароль, чтобы проверить свои листы.

Программа запускается с фиктивным паролем, который не удастся выполнить, и когда это произойдет, пользовательская форма (с именем *) 1003 *) отображается для ввода пароля для всех файлов. Впоследствии каждая рабочая книга открывается с помощью этого пароля. Таким образом, он должен A) никогда не завершаться с ошибкой и B) никогда не использовать пользовательскую форму ввода пароля по умолчанию.

Private Function CheckFiles(ByRef WkbApp As Excel.Application, _
            WkbFolder As String, _
            FoundFile As String, _
            NeededSheets As Scripting.Dictionary, _
            ByRef Pass As String) As Boolean

    Dim Wkb As Workbook

    WkbApp.Visible = False

    ' Attempts to open the workbook. If it fails, then attempts to get a
    '  better password from the user. This password is saved for further
    '  attempts, but only during runtime.
    On Error Resume Next
        Set Wkb = WkbApp.Workbooks.Open(Filename:=WkbFolder & FoundFile, _
                    Password:=Pass)

        If Err.Number > 0 Then
            PasswordUserform.FileNameLabel.Caption = "'" & _
                    Left(FoundFile, 20) & "...'"
            PasswordUserform.Show

            Pass = PasswordUserform.PasswordBox.Text
            Unload PasswordUserform

            Set Wkb = WkbApp.Workbooks.Open(Filename:=WkbFolder & FoundFile, _
                        Password:=Pass)
        End If

    On Error GoTo 0

    ' Do Stuff within workbook, Setting function to True or False depending on contents
End Function

Функция вызывается в простом Do Пока l oop:

    Do While Len(FoundFile) > 0
        FoundDate = FileDateTime(WkbFolder & FoundFile)
        If FoundDate > LatestDate And CheckFiles(WkbApp, WkbFolder, _
                    FoundFile, NeededSheets, Pass) Then
            LatestDate = FoundDate
            LatestFile = FoundFile
            LatestPass = Pass
        End If

        FoundFile = Dir
    Loop

При переходе через первый Set Wkb может отображаться или не отображаться пользовательская форма пароля по умолчанию. Если это появляется и отменяется, отображается пользовательский PasswordUserform. При правильном вводе второй Set Wkb (в области IF) всегда отображает пользовательскую форму пароля по умолчанию. Но в следующем файле пароль используется правильно, и пользовательская форма не отображается. Наконец, случайный файл создаст пользовательскую форму пароля по умолчанию (при вводе пароля, который должен был быть предоставлен, он открывается нормально, так как все файлы в папке используют один и тот же пароль).

Я попытался установить WriteResPassword также, без разницы. Кроме того, DisplayAlerts=False не устраняет проблему.

1 Ответ

0 голосов
/ 07 января 2020

виновник был WkbApp.Visible = False. Установив приложение невидимым, когда макрос неизбежно потерпит крах во время будущего тестирования, он не выйдет из строя изящно, и, следовательно, приложение и его рабочие книги будут существовать, но будут недоступны для просмотра пользователем.

При запуске макроса Опять же, он видит, что файл заблокирован для редактирования, но вместо отображения предупреждения о блокировке для редактирования он просто снова запрашивает пароль (не уверен, почему это так).

Изменение приложения на :

Set ResultApp = New Excel.Application
ResultApp.WindowState = xlMinimized
ResultApp.Visible = True

Позволяет пользователю закрыть окно, когда что-то go ужасно неправильно.

Кроме того, использование параметра ReadOnly позволяет программе открывать копию независимо от того, открыто.

Set Wkb = WkbApp.Workbooks.Open(Filename:=WkbFolder & FoundFile, _
            Password:=Pass, ReadOnly:=True)

Поскольку я все равно сохраняю в новый файл, это работает для меня, но может не сработать, если кто-то захочет отредактировать и сохранить открываемый файл.

Я был бы рад узнать о нем любой способ захватить твердую кр sh и грациозно закрыть ~

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