Excel не завершает макрос после открытия другой рабочей книги

Я пытаюсь заставить VBA запускать команды

sImportFilePath = Application.GetOpenFilename(FileFilter:= _
"Excel Files (*.xls), *.xls", Title:="Choose The Source File")
Application.Workbooks.Open (sImportFilePath)
sImportFileName = FunctionGetFileName(sImportFilePath)

И они работают, когда я перехожу через функцию, но когда я использую горячую клавишу Ctrl + Shift + F или любую другую горячую клавишу, команда Application.Workbooks.Open работает, но она перемещает новый документ Excel, то ничего не делает. Однако, когда я открываю "Макросы" на вкладке "Разработчик", выберите мой макрос и нажмите "Запустить", все работает нормально.

Ответ 1

Я на самом деле столкнулся с этой точной проблемой и, наконец, нашел решение моей проблемы.

Это клавиша Shift в сочетаниях клавиш, которые вы используете для вызова своего кода.

Очевидно, что в Excel специально создана функция, предотвращающая запуск кода при открытии книги и нажатии клавиши Shift, но, к сожалению, это также влияет на открытие книг с помощью метода Workbook.Open через VBA, Это было упомянуто в KB Article 555263, применительно к Excel 2000 и 2003, но я столкнулся с той же проблемой в Excel 2010, поэтому, я думаю, это также влияя также на 2007 год.

Это происходит специально, когда вы пытаетесь открыть книгу по коду очень рано в программе. Если вызов Workbook.Open достигнут в коде, прежде чем у вас будет достаточно времени, чтобы фактически отпустить кнопку Shift, Excel интерпретирует это как попытку блокировать запуск кода и прервать процесс. И нет сообщений об ошибках или чего-либо, что я нашел. Он просто резко останавливается.

Обходной путь/исправить - заставить код ждать, пока клавиша Shift будет выпущена до выдачи команды Workbook.Open.

В статье просто добавьте этот код в свой макрос, и он должен это сделать:

'Declare API
Declare Function GetKeyState Lib "User32" (ByVal vKey As Integer) As Integer
Const SHIFT_KEY = 16

Function ShiftPressed() As Boolean
'Returns True if shift key is pressed
    ShiftPressed = GetKeyState(SHIFT_KEY) < 0
End Function

Sub Demo()
    Do While ShiftPressed()
        DoEvents
    Loop
    Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx"
End Sub

(ПРИМЕЧАНИЕ. Этот код предназначен для 32-разрядных версий Excel. 64-разрядные версии должны использовать атрибут PtrSafe в инструкции Declare).

Если вы не хотите добавлять дополнительный код, то ваши другие другие опции не должны использовать Ctrl + Shift + Some Letter для запуска макроса или для добавления команды Workbook.Open макрос (не в начале в начале), чтобы дать себе время, чтобы освободить кнопку Shift после ее запуска.

Ответ 2

Просто добавьте один вызов к "DoEvents" перед вызовом Workbooks.Open уже сделает трюк. Таким образом, следующий фрагмент будет работать:

DoEvents
Workbooks.Open Filename:="C:\MyPath\MyFile.xlsx"

Ответ 3

Простым обходным путем, который сделал это для меня, является назначение VBA клавише быстрого доступа без сдвига. Я не большой поклонник этого, потому что есть много конфликтов с ярлыками Excel Dafault. Но есть несколько доступных в Excel 2010 на основе этой статьи: Ctrl + e, Ctrl + j, Ctrl + m, Ctrl + q.

Ответ 4

Временное решение, найденное на французском форуме: используйте ниже ForEachWinDoEvents прежде чем активировать книгу по вашему выбору.

Sub Test()
    Application.ScreenUpdating = False
    Set w1 = Workbooks.Add(xlWBATWorksheet)
    Set w2 = Workbooks.Add(xlWBATWorksheet)
    Set w3 = Workbooks.Add(xlWBATWorksheet)
    Application.ScreenUpdating = True
    ForEachWinDoEvents
    w2.Activate
End Sub

Sub ForEachWinDoEvents()
Dim win As Window
  For Each win In Application.Windows
    DoEvents
  Next win
End Sub

Ответ 5

Вопрос: у вас есть строка кода, которая выбирает несколько вкладок в любое время перед этой строкой кода? Я обнаружил, что это похоже на удерживание в клавише сдвига все время, когда они выбраны. Чтобы решить эту проблему, у меня была макрогруппа (одна выборка) на вкладке, и макрос начал работать тогда.

Ответ 6

Мое предположение заключалось бы в изменении

Application.Workbooks.Open (sImportFilePath)

to

Application.Workbooks.Open sImportFilePath

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

если "Option Explicit" добавлен в начало режима, отладчик все же позволяет вам пройти через него?