Не отвечает лента после открытия новой книги Excel 2016 VBA - PullRequest
0 голосов
/ 13 июня 2018

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

В настоящее время у меня возникает неприятная проблема при попытке открыть новую книгу с помощью workbooks.open() в Excel 2016.

Я создал книгу с кнопкой, которая вызывает пользовательскую форму.После запуска формы пользователь может выбрать для загрузки и открытия несколько типов файлов .xls.Когда пользователь нажимает кнопку OK формы, все соответствующие функции вызываются, выбранные рабочие книги открываются, а форма выгружается и скрывается.

Однако лента последней открытой книги, которая, кстати, является активной в данный момент, не отвечает и единственный способ преодолеть это - ALT + TAB между открытыми окнами.

Кажется, что "фокус" все еще находится на исходной книге с кнопкой, потому что, если я вызову Msgbox после того, как форма выгружена, это то, где она появляется.Стоит отметить, что это происходит, хотя первоначальная рабочая книга не является активной.

После некоторых экспериментов мне удалось решить эту проблему, отключив Application.ScreenUpdating при вызове моей функции, а затем снова включив ее непосредственно перед выгрузкой формы.

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

Упрощенная версия кода, которая повторяет проблему, выглядит следующим образом:

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False 'solves the issue but only for multiple files - comment out to replicate the problem
If OptionButton1 Then
    Workbooks.Open ("http://www.admie.gr/fileadmin/user_upload/reports/DayAheadSchedulingUnitAvailabilities/20180602_DayAheadSchedulingUnitAvailabilities_01.xls")
Else
    Workbooks.Open ("http://www.admie.gr/fileadmin/user_upload/reports/DayAheadSchedulingUnitAvailabilities/20180603_DayAheadSchedulingUnitAvailabilities_01.xls")
    Workbooks.Open ("http://www.admie.gr/fileadmin/user_upload/reports/DayAheadSchedulingUnitAvailabilities/20180604_DayAheadSchedulingUnitAvailabilities_01.xls")
End If
Application.ScreenUpdating = True 'solves the issue but only for multiple files - comment out to replicate the problem
Unload UserForm1
UserForm1.Hide
MsgBox ActiveWorkbook.Name 'for debugging purposes - comment out to replicate the problem - the msgbox will be displayed on the workbook which called the userform, although it's not the active one
End Sub

Sub Button1_Click() 'calls the userform
UserForm1.OptionButton1.Value = True
Load UserForm1
UserForm1.Show vbModeless 'comment out to replicate the problem - solves the issue but creates unwanted behavior
End Sub

Кто-нибудь имел дело с этим раньше?

Что бы вы предложили?

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Я столкнулся с той же проблемой на складе Excel, когда открывал только 1 книгу.При добавлении этого после Workbooks.open ленты снова включатся:

    ThisWorkbook.Activate
    Workbooks("*openedWorkbookName*").Activate

Кстати, некоторые старые коды приводят к ошибкам во время выполнения при выборе ячейки на рабочем листе, которая в данный момент не активирована.Это помогло и в этом вопросе.

0 голосов
/ 17 марта 2019

Я использую макрос Excel для создания новых книг и заполнения их данными (Office 365).

Public New_Wb As Workbook
Public New_Book_Name as String

Workbooks.Add
New_Book_Name = ActiveWorkbook.Name
Set New_Wb = ActiveWorkbook

Я также столкнулся с проблемой, что новая книга будет частично активной после завершения макроса,Я мог работать в ячейках книги, но лента была неактивной.Укладка и возврат к новой книге активировали ленту, но это было досадно.Я заметил, что щелчка правой кнопкой мыши внутри книги было достаточно, чтобы активировать ленту.Странно, да.Поэтому я выследил код, чтобы вызвать правое, а затем левое событие щелчка мыши после завершения макроса (ниже)Это настоящий клудж, но он происходит так быстро, что его не видно, и оставляет ленту в активном состоянии.

Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10

... после заполнения рабочей книги ...

New_Wb.activate

mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0

mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
0 голосов
/ 13 июня 2018

Есть ли у вас надстройки включены в Excel за пределами стандарта.Например, я использую продукт Utility под названием ASAP, а исполняемые файлы, которые запускают события, перезаписывают друг друга при запуске Excel.Он закроет ленту при первом открытии Excel, поэтому я создаю новый Excel каждый раз, когда открываю свой первый Excel

.
...