Как получить имя файла при запуске - PullRequest
2 голосов
/ 19 июня 2019

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

Private Sub Workbook_Open()
    Dim name As String
    name = ActiveWorkbook.FullName
    If InStr(name, "Export Checksheet") > 0 Then
        UserForm1.Show
    End If
End Sub

Проверка этого файла, который уже открыт, проходит нормально, но попытка его естественного запуска при открытии файла вызывает ошибку времени выполнения «91» и указывает на строку, определяющую переменную name.

Ответы [ 2 ]

3 голосов
/ 19 июня 2019

Похоже, ThisWorkbook загружает до независимо от того, какую другую рабочую книгу вы открываете, поэтому ActiveWorkbook равно Nothing, и любой вызов участника против него вызовет ошибку 91.

Обработчик Workbook_Open будет работать только для ThisWorkbook (документ, содержащий проект VBA) - вам нужно подключить другой обработчик на уровне приложения, чтобы вы могли запускать код всякий раз, когда любой рабочая книга открыта.

Измените обработчик Workbook_Open, чтобы захватывать ссылку на экземпляр Application в объектную переменную уровня WithEvents:

Option Explicit
Private WithEvents app As Excel.Application

Private Sub Workbook_Open()
    Set app = Me.Application
End Sub

Теперь выберите app из левого раскрывающегося списка и создайте обработчик для события WorkbookOpen - , в котором вы захотите проверить, нужно ли открывать это диалоговое окно:

Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
    If InStr(Wb.FullName, "Export Checksheet") > 0 Then
        With New UserForm1
            .Show
        End With
    End If
End Sub

Обратите внимание, что событие всего приложения предоставляет вам объект Workook, поэтому вам не нужно заботиться о том, является ли это ActiveWorkbook.

2 голосов
/ 19 июня 2019

Это будет работать:

Option Explicit
Private Sub Workbook_Open()

    Dim wb As Workbook

    For Each wb In Workbooks
        If wb.name Like "*Export Checksheet*" Then
            wb.Activate
            Userform1.Show
        End If
    Next wb

End Sub

Хотя я не понимаю, почему вы это делаете, почему вы не пишете этот код и пользовательскую форму только в контрольном листе экспорта книги?

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