VBA - невозможно открыть рабочий лист во время работы VBA - PullRequest
0 голосов
/ 16 ноября 2018

У меня проблемы с открытием листа во время работы VBA (поскольку Excel / VBA занят, насколько мне известно, это предотвращает открытие другого листа).

SendKeys ("%O")

Application.Wait DateAdd("s", 1, Now)


'Loop that waits for file to open
Dim TestWorkbook As Workbook
Set TestWorkbook = Nothing

On Error Resume Next
Set TestWorkbook = Workbooks("export.csv")

OpenLoop:
If TestWorkbook Is Nothing Then
    Application.Wait DateAdd("s", 1, Now)
    GoTo OpenLoop
Else
End If
'Loop that waits for file to open (End)

Workbooks("export.csv").Activate

SendKeys ("%O") используется для открытия файла в Internet Explorer, как показано ниже:

enter image description here

Если код закончился здесь, он будет успешно открыт после завершения работы VBA. Теперь он просто застревает в цикле, поскольку занятость VBA препятствует открытию файла.

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

Любая помощь будет оценена, спасибо заранее.

1 Ответ

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

Если Set TestWorkbook = Workbooks("export.csv") приводит к Nothing, то следующий код будет зацикливаться вечно

OpenLoop:
If TestWorkbook Is Nothing Then
    Application.Wait DateAdd("s", 1, Now)
    GoTo OpenLoop
Else
End If

, потому что вы никогда не пытаетесь Set TestWorkbook к чему-либо снова.

Так что лучше использоватьчто-то вроде этого:

Dim TestWorkbook As Workbook
Set TestWorkbook = Nothing

Do
    On Error Resume Next
    Set TestWorkbook = Workbooks("export.csv")
    On Error Goto 0 'always re-activate error reporting!!!
    ' you can add a wait here but it's not necessarily needed.
    DoEvents 'keep Excel responsive (in case of endless loop)
Loop While TestWorkbook Is Nothing

Обратите внимание, что этот цикл будет работать до тех пор, пока не будет открыт export.csv.Если он никогда не откроется, он будет работать вечно.Поэтому, вероятно, вы хотите вставить критерий времени, чтобы отменить цикл через некоторое время, например.1 минута.

Обратите внимание, что Application.Wait DateAdd("s", 1, Now) необязательно.Цикл просто попытается найти книгу до тех пор, пока она там не будет, даже без ожидания.

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