Я жую эту проблему более двух недель, включая вопрос здесь, но я неправильно понял и вопрос, и его решение. Поэтому я хочу попробовать еще раз.
У меня есть пользовательская форма, которую я открываю в Excel. В нем перечислены все открытые в настоящее время рабочие книги и я могу открыть дополнительные. Моя программа будет добавлять, изменять или удалять таблицы в любой из рабочих книг. Таблицы должны быть в листах имен, которые генерирует программа. Такие рабочие листы будут добавлены, если они не существуют. Когда лист добавляется, он сортируется в определенном месте в последовательности вкладок в зависимости от его имени. Каждое из этих действий работает на ThisWorkbook. Мне трудно определить, при каких условиях некоторые из них не работают с другими книгами и, следовательно, не могут найти лекарство.
Начните с формы. Он вызывается из рабочего листа в ThisWorkbook. У меня было это модально. Теперь это немодально. Я не заметил никакой разницы. Однако из-за огромного количества возможностей у меня возникли трудности с созданием хорошего способа всестороннего тестирования. Я ищу знания, которые могут сэкономить мне много проб и ошибок.
Книги добавляются с этим кодом. Кроме того, насколько мне известно, приостановка ScreenUpdating во время этого процесса неэффективна. Это устанавливает окно в невидимое, что вызывает эффект.
Dim Fltr As String
Dim Ffn As Variant
Dim Fn() As String
Dim Wb As Workbook
Dim i As Long
Fltr = "Excel Workbooks|*.xls*||All Excel files|*.xl*"
Ffn = FileOpenName("Select a Target Document", Fltr, , True)
If Not IsEmpty(Ffn) Then
Application.ScreenUpdating = False
For i = 1 To UBound(Ffn)
Fn = Split(Ffn(i), "\")
On Error Resume Next
Set Wb = Workbooks(Fn(UBound(Fn)))
If Err Then
Set Wb = Workbooks.Open(Ffn(i))
ActiveWindow.Visible = False
End If
Next i
ThisWorkbook.Activate
Application.ScreenUpdating = True
Когда форма загружена ThisWorkbook активен. Все остальные открытые рабочие книги невидимы. Эффект этого кода в том, что новые рабочие книги также невидимы, и ThisWorkbook остается активным. Внешне нет никакой разницы, но это, кажется, только на поверхности.
Когда я хочу добавить лист в другую рабочую книгу, эта книга, очевидно, должна быть активной. Я успешно сделал это с модальной и немодальной формой, но сейчас мой код отказывается активировать рабочую книгу (Wb.Activate
игнорируется без уведомления), и лист добавляется в ThisWorkbook. Это код, который добавляет лист.
Private Function CreateLibrary(Wb As Workbook, _
Frm As Modifier) As Worksheet
' SSY 052 ++ 26 Apr 2020
Dim ClmWidth As Variant ' default column widths
Dim C As Long
' Windows(Wb.Name).Visible = True
With Wb.Worksheets.Add
With .Cells
.HorizontalAlignment = xlLeft
.VerticalAlignment = xlTop
.WrapText = True
' Library font = Arial / Table font = Calibri
With .Font
.Name = "Arial"
.Size = 10
End With
End With
' set default widths
ClmWidth = Array(8.43, 10.57, 52, 24, 24)
For C = 0 To UBound(ClmWidth)
.Columns(C + 1).ColumnWidth = ClmWidth(C)
Next C
.Rows.RowHeight = 12.75
.Name = Frm.TbxLib.Value
End With
Set CreateLibrary = ActiveSheet
End Function
Я думаю, причина в том, что я не могу активировать книгу в невидимом окне. Я полагаю, что раньше это работало потому, что окно было невидимым, хотя его свойство Visible было установлено в True. Я думаю, что это была рабочая тетрадь, которую я не открывал, но которая была открыта при вызове формы. Эти рабочие книги не находятся в невидимом windows. Просто windows не активны. Одна из проблем заключается в том, что Excel активирует окно, в котором открывается новая рабочая книга. Поэтому мой код выше должен быть неправильным. Я нашел метод на SO.
В моем предыдущем вопросе на эту тему я жаловался на то, что новые листы добавляются не в том месте, иногда в ThisWorkbook вместо назначенного. Я думал, что проблема будет решена путем обновления экрана. Это не было правдой. Новый лист будет в неправильной рабочей книге в зависимости от того, как была открыта предполагаемая рабочая книга. Мой код просто добавил его в ActiveWorkbook. Но я до сих пор не знаю, почему он всегда на втором месте. Я обнаружил, что мой код вставил (код на этот счет) рабочий лист раньше всех остальных, но сразу после этого был запущен сортировщик, который может снова переместить лист в зависимости от того, какие другие листы уже есть в рабочей книге и, возможно, переместить его в ActiveWorkbook тоже. Я подозреваю, что сортировщик может вызвать проблемы в зависимости от того, активна ли рабочая книга или нет, а ее окно видно или скрыто. Сортировщик работает нормально при нормальных обстоятельствах, но результат этого в том, что я не знаю, вставлен ли лист в правильном положении для начала. Сейчас я делаю тесты без сортировщика, но у меня проблема с вставкой листа вообще.
Я в замкнутом круге и не могу найти выход. Я думаю, что сама форма лежит в основе моей проблемы. В Excel VBA (2013) рабочая книга формы будет активной по умолчанию. Наличие немодальной формы и перелистывание рабочих книг, выбранных в этой форме, больше невозможно. Но это не то, чего я хочу. Я хочу, чтобы все книги, за исключением допустимого ThisWorkbook, оставались в фоновом режиме. Я думаю, что моя головоломка стала бы разрешимой, если бы я мог найти способ открыть дополнительные рабочие книги и поставить их в то же техническое положение, что и рабочие книги, которые были открыты уже при открытии формы - в видимом, но неактивном windows. Я прочитал чей-то совет временно закрыть форму и перезагрузить ее, но похоже, что нужно взять молоток, чтобы ударить муху.
Редактировать: - Тем временем я добавил следующий код в процедуру, описанную выше.
ThisWorkbook.Activate
Dim Win As Window
For Each Win In Application.Windows
Debug.Print Win.Index, Win.Caption,
Debug.Print Win Is ActiveWindow,
Debug.Print Win.Visible
Next Win
Application.ScreenUpdating = True
Это дает удивительный результат.
- Windows (1) - ThisWorkbook
- Windows (2) было открыто при загрузке формы
- Остальные 3 были добавлены с использованием кода выше, где я изменил
ActiveWindow.Visible = False
на Windows(1).Visible = False
Windoes (1) должен быть ActiveWindow не (2). Windows (1) и (3) фактически видны в строке вкладок в нижней части приложения Excel, но не в других 3, включая № 2, который был там раньше. Обратите внимание, что эти windows не имеют установленного свойства Visible. Все это изменилось, когда я закрыл форму. Я запустил тот же код и получил эту распечатку, которая также не имеет смысла. Однако все 5 windows теперь включены в панель вкладок в нижней части окна Excel, очевидно, независимо от их состояния видимости.
Мне также интересно, какой смысл немодальной формы в моем контексте. Кажется, он предназначен для переключения листов собственной рабочей книги. Поэтому безразличие - лучший вариант развития событий. Что хуже?