Активировать рабочую книгу незаметно из пользовательской формы - PullRequest
0 голосов
/ 03 мая 2020

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

У меня есть пользовательская форма, которую я открываю в 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

Это дает удивительный результат.

enter image description here

  • 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, очевидно, независимо от их состояния видимости.

enter image description here

Мне также интересно, какой смысл немодальной формы в моем контексте. Кажется, он предназначен для переключения листов собственной рабочей книги. Поэтому безразличие - лучший вариант развития событий. Что хуже?

1 Ответ

0 голосов
/ 06 мая 2020

Независимо от того, есть ли решение моей проблемы, теперь очевидно, что я не найду его. Поэтому я сделал следующие определения:

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

Приведенная выше процедура устранит два вопросительных знака, но надеется, что Excel или VBA заполнят пробелы в отношении управления Windows и его влияния на доступность книг, отличных от ThisWorkbook. Я надеюсь, что мне не нужно будет переносить код в надстройку, но это моя предполагаемая следующая линия защиты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...