Страницы: 1
RSS
Работа с другим файлом. Назначенное сочетание клавиш мешает макросу
 
Пришла пора спрашивать совета.

Думалось прицепить обработку в надстройку или Personal. Обнаружил такую неприятность...
Открываем другой файл (расширение не важно), берем данные (в примере ничего не берем), закрываем. Обычная работа с Workbooks.Open:
Код
Sub testtest_()
    Dim sFName As String
    
    With Application.FileDialog(msoFileDialogFilePicker)
        If .Show = False Then
            MsgBox "Файл не выбран!", 48, "Ошибка": End
        Else
            sFName = .SelectedItems(1)
        End If
    End With
    
    ' With Application: .ScreenUpdating = False: .DisplayAlerts = False: End With
    With Workbooks.Open(Filename:=sFName)
        .Close
    End With
    ' With Application: .ScreenUpdating = True: .DisplayAlerts = True: End With
    
    MsgBox "OK", 64, ""
End Sub
Запуск из редактора или кнопкой - без проблем, код отрабатывет полностью.
Если запускать назначенными клавишами (Ctrl+Shift+q) - вываливается после открытия другого файла.

Set wBook = Workbooks.Open(Filename:=sFName), отключение обновления экрана, окно выбора файла в отдельной процедуре, небольшая задержка перед/после открытия файла  - то же самое, без изменений - файл открылся и процедура завершилась (без ошибок).

Почему и как обойти проблему?
Прошу помощи.
Win10, Office2010
 
Цитата
vikttur написал:
вываливается после открытия другого файла
кто и куда? Ошибка появляется? Или диалог? После открытия другого - это какого и как? Руками, кодом, не важно?
Помнится были какие-то проблемы с диалогами, но там ошибки появлялись вследствие вмешательства другой надстройки.
Изменено: Дмитрий(The_Prist) Щербаков - 26.08.2019 17:22:26
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Открытие файла с помощью диалога FileDialog(msoFileDialogFilePicker) (в коде видно)
Строка 13 отрабатывает и... все. Другой файл открыт, макрос отработал, ошибок нет. Такое происходит, если макрос запускался сочетанием клавиш, назначенных при WorkBook.Open
Запуск кнопкой - процедура отрабатывает полностью.
 
Да эффект присутствует. ни разделение на Set wb = Workbooks.Open(Filename:=sFName) ги прочее не помогает. Открылась книга- макрос прекратил работать :-(
По вопросам из тем форума, личку не читаю.
 
Проблема воспроизводится (Win10 + Excel 2016, 32-). Думаю, что неудачно выбрано сочетание клавиш. С Ctrl+q ("^q") должно работать нормально.
Изменено: sokol92 - 26.08.2019 18:18:17
Владимир
 
Владимир, а в данном случае Shift - это  что-то типа  провокации (аналог открытия файла с отключенными макросами)? :)
 
Трудно сказать. Я никогда не использую комбинации, где есть Shift+буква (да и разработчик применяет лишь в паре случаев).
Изменено: sokol92 - 26.08.2019 18:42:12
Владимир
 
Цитата
sokol92 написал:
где есть Shift+буква.
по нику заметно :-)
По вопросам из тем форума, личку не читаю.
 
:)  
Владимир
 
Цитата
Юрий М написал:
аналог открытия файла с отключенными макросами)?
а может оно и есть? такое только с шифтом повторяется.
По вопросам из тем форума, личку не читаю.
 
Win7/32 Of10/32 проблема есть.
При чем тут отключенные макросы? Код работает, значит макросы включены. А в открываемой книге их попросту нет.
Если в коде поставить остановку, то все выполняется правильно.
 
Цитата
RAN написал:
Если в коде поставить остановку, то все выполняется правильно.
Андрей, где поставить? я после открытия книги ставил и до него не доходит. И самое принципиальное, что проявляется только при вызове с SHIFT.
По вопросам из тем форума, личку не читаю.
 
Я ставил на строке открытия.
 
Да, если в сочетании присутствует Shift, то происходит "сброс".
Паузы не помогают. Даже если вызвать другой макрос потом им запустить тот макрос в котором происходит открытие книги, всё равно сброс происходит.
Решил эту проблему так:
В ЭтаКнига запускаю макрос
Код
Application.OnKey "^+q", "testt"

Который в модуле
Код
Private Sub testt()
Application.OnTime Now + TimeValue("00:00:01"), "testtest_"
End Sub

А макрос запускает уже наш макрос на открытие
Код
Sub testtest_()
Dim sFName As String
With Application.FileDialog(msoFileDialogFilePicker)
    If .Show = False Then
        MsgBox "Файл не выбран!", 48, "Ошибка": End
    Else
        sFName = .SelectedItems(1)
    End If
End With
With Workbooks.Open(Filename:=sFName)
    .Close
End With
MsgBox "OK", 64, ""
End Sub

В таком случае всё проходит гладко, но это конечно костыль.
У меня Office 2010 Win7x86
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
И диалог не при делах.
Даже так не работает
   
Код
Workbooks.Open Filename:="C:\Users\OFIS\Documents\3811803.xlsx"
        ActiveWorkbook.Close
 
Диалог вообще любой можно пихать, я тоже разные попробовал. Как только происходит открытие книги всё останавливается. Тут именно на Shift ругается.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Без ёлки не приходи! Зато с ёлкой приходи.  :)
Код
Sub testtest_()
    Application.OnTime Now + TimeValue("00:00:01"), "testt"
    Workbooks.Open Filename:="C:\Users\OFIS\Documents\3811803.xlsx"
End Sub

Private Sub testt()
    ActiveWorkbook.Close
    MsgBox "OK", 64, ""
End Sub
 
Без шифта сочетание, проходит всё хорошо.
Надо подумать как макросом сбросить то, что он запомнил, что процедуры были запущены с нажатым Шифтом.
RAN, я в #14 примерно тоже самое описал.
Изменено: Alemox - 26.08.2019 20:29:11
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
надо просто добавить DoEvents после диалога:
Код
With Application.FileDialog(msoFileDialogFilePicker)
        If .Show = False Then
            MsgBox "Файл не выбран!", 48, "Ошибка": End
        Else
            sFName = .SelectedItems(1)
        End If
    End With
    DoEvents
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
RAN написал:
Без ёлки не приходи!
Прокуренный мозг говорит что елке не хватает звездочки на макушку, а точнее проверки, а то ли открыто. Ведь не все книжки за секунду открываются и дело не только в мощах святых компа , но и в размере файла, месте его хранения и канале до этого места.
По вопросам из тем форума, личку не читаю.
 
А ларчик просто открывался
Код
Sub testtest_()
    DoEvents
    Workbooks.Open Filename:="C:\Users\OFIS\Documents\3811803.xlsx"
    ActiveWorkbook.Close
    MsgBox "OK", 64, ""
End Sub
 
Цитата
RAN написал: Если в коде поставить остановку, то все выполняется правильно.
Да, останавливал на строке открытия, потом F8 (один шаг - файл открыли), потом F5. Код отрабатывал полностью.

Цитата
RAN написал:  Application.OnTime
Цитата
vikttur написал: небольшая задержка перед/после открытия файла
Ставил, 2 секунды держал. но только Application.Wait. Не помогало.

Цитата
sokol92 написал: неудачно выбрано сочетание клавиш
Менял, но Shift не убирал. Проверил без него - нормально работает.

Цитата
RAN написал: А ларчик просто открывался... DoEvents
Это простой костыль называется :)
Дима тоже это показал. Но как оно объясняет проблему?

Значит, до создания темы потеряно два часа не зря. А то думал - что-то простое не улавливаю.
 
Цитата
RAN написал:
А ларчик
осталось ларчику дать объяснение. При этом и как влияет doevents вставленное перед Open и почему влияет именно при Shift. Чую ZVIриное пояснение надо ждать.
По вопросам из тем форума, личку не читаю.
 
Действительно Ларчик с подвохом. Смело можно в тесты засовывать.  :D
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Цитата
vikttur написал:
Это простой костыль называется
Почему костыль?
Мне представляется такое объяснение
Excel запоминает поступившие команды клавиатуры. Но при открытии файла макросы не отключаются, а останавливаются.
DoEvents сбрасывает все эти команды. И дальнейшее открытие файла идет обычным путем.
 
Вот оно как... Логично. Это объясняет поведение макроса.
А "костыль" - это о том, что легче убрать помеху из сочетания клавиш.

Всем умам большое спасибо.
Проблема растворилась и, похоже, получила четкое объяснение.
 
vikttur, может ещё сработает вариант, если открытие файла, получение данных и его закрытие перенести в отдельную функцию (не знаю как с процедурой, может это важно) - у меня как раз были проблемы с получением массивов из именованных диапазонов и функция спасла, а почему напрямую не вышло так и не понял (заманался ковыряться)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Такк и есть. Все, что можно, разнесено в отдельные процедуры. Андрей в сообщении №25 описал, почему возникает проблема и теперь понятно, как она решается.
Цитата
Jack Famous написал: почему напрямую не вышло так и не понял
Это плохо. Повторится - опять головомойка?
 
OFF
Цитата
vikttur: Это плохо. Повторится - опять головомойка?
согласен. Не совсем так написал - понял, что нюансы именно в получении массива, но на 100% воспроизвести ошибку не удалось. Оставил функцию с самым надёжным вариантом, а как только покажется ошибка, разберусь.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх