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" добавлен в начало режима, отладчик все же позволяет вам пройти через него?