Программирование для интерфейса с одним документом в Excel

Узнайте о рекомендациях по программированию для интерфейса с одним документом в Excel.

Сравнение интерфейсов с одним и несколькими документами в Excel 2010 и Excel 2013

Новая функция в Excel 2013 — интерфейс с одним документом (SDI). SDI — это метод организации приложений графического пользовательского интерфейса по отдельным окнам, которые диспетчер окон операционной системы обрабатывает отдельно. В Excel 2013 каждое окно Excel может содержать только одну книгу, и каждое из них имеет собственный пользовательский интерфейс ленты (см. рис. 1). По умолчанию при открытии новой книги она будет отображаться в другом окне Excel, даже если это тот же экземпляр Excel.

Рис. 1. Интерфейс с одним документом в Excel 2013

Интерфейс с одним документом в Excel 2013

Это контрастирует с интерфейсом С несколькими документами (MDI), в котором одно родительское окно используется для размещения нескольких вложенных дочерних окон, при этом только родительское окно имеет меню или панель инструментов. В Excel 2010 каждая книга в одном экземпляре Excel использует общий пользовательский интерфейс ленты (см. рис. 2).

Рис. 2. Интерфейс с несколькими документами в Excel 2010

Интерфейс с несколькими документами в Excel 2010

Excel 2010 использует MDI, что означает, что существует одно окно уровня приложения, в котором хранятся все книги, открытые в конкретном экземпляре Excel. Окна книги можно упорядочить в окне приложения Excel, при этом все они совместно работают в одном пользовательском интерфейсе ленты. SDI в Excel означает, что каждая книга будет иметь собственное окно приложения верхнего уровня и собственный пользовательский интерфейс ленты.

Примечание.

В Excel нет параметра совместимости MDI.

В системах с двумя мониторами SDI в Excel позволяет параллельно сравнивать две книги, перетаскивая каждую книгу на другой монитор. Каждая книга работает независимо от другой.

Чтобы увидеть SDI и MDI в действии, если у вас есть excel 2010 и Excel 2013, выполните следующие действия.

Сравнение количества процессов для интерфейсов MDI и SDI

  1. В меню "Пуск" Windows запустите Excel 2010.
  2. Запустите второе вхождение Excel. Убедитесь, что отображаются два окна Excel.
  3. На панели задач Windows выберите и выберите Запустить диспетчер задач.
  4. Перейдите на вкладку Процессы и прокрутите вниз, пока не увидите две записиExcel.exe . Это говорит о том, что по умолчанию Excel открывает новый экземпляр при каждом вызове (два экземпляра Excel).
  5. Закройте два экземпляра Excel.
  6. В меню "Пуск" Windows выберите Excel 2013.
  7. Запустите второе вхождение Excel. Убедитесь, что отображаются два окна Excel.
  8. Снова запустите диспетчер задач.
  9. На вкладке Процессы прокрутите вниз, пока не увидите Excel.exe. Имейте в виду, что хотя вы открыли два экземпляра Excel, две книги содержатся в одном экземпляре Excel.

Чтобы узнать, как работают SDI и MDI в экземпляре Excel, выполните следующие действия.

Сравнение количества экземпляров Excel для интерфейсов MDI и SDI

  1. В меню "Пуск" Windows выберите Excel 2010.
  2. Выберите окно Excel, чтобы сделать его активным, и убедитесь, что Book1 является текущей книгой.
  3. Нажмите клавиши CTRL+N, чтобы открыть другую книгу. Убедитесь, что Book2 теперь является текущей книгой.
  4. Свернуть Book2 , а затем см. раздел Book1. Обе книги содержатся в одном экземпляре Excel.
  5. Закройте Excel.
  6. В меню "Пуск" Windows выберите Excel 2013.
  7. Выберите окно Excel, чтобы сделать его активным, и убедитесь, что Book1 является текущей книгой.
  8. Нажмите клавиши CTRL+N, чтобы открыть другую книгу. Убедитесь, что Book2 открыта в отдельном окне (но все равно в том же экземпляре Excel).
  9. Закройте Excel.

Примечание.

Вы можете открыть несколько экземпляров Excel с помощью следующего параметра командной строки: excel.exe /x. Этот параметр запускает Excel в новом процессе.

В этой статье мы обсудим реализацию SDI в пользовательском интерфейсе Excel и ее влияние на программируемость в Excel.

Что изменилось в пользовательском интерфейсе

Если вы внимательно посмотрите после открытия книги Excel, вы больше не увидите кнопки состояния окна ( свернуть, развернуть и восстановить) в правом верхнем углу ленты. На рисунке 3 показаны кнопки состояния окна, доступные в Excel и Excel 2007. Так как окно верхнего уровня теперь привязано непосредственно к одной книге или представлению книги, в пользовательском интерфейсе управления Windows в Excel больше не требуется.

Рис. 3. Элементы интерфейса Windows в Excel 2010

Элементы интерфейса Windows в Excel 2010

Кроме того, начиная с Excel, в одном окне экземпляра Excel больше нет нескольких окон книг, как показано на рис. 4.

Рис. 4. Несколько книг в одном окне экземпляра Excel

Несколько книг в одном экземпляре Excel

Пересчет и формулы

Пересчеты в Excel по-прежнему будут "глобальными", что означает, что они происходят между книгами в одном экземпляре Excel. Формулы, ссылающиеся на книги, открытые в одном экземпляре Excel, будут совместно участвовать в вычислениях и использовать один и тот же режим вычисления книги (автоматический, автоматический, кроме таблиц данных и ручной).

В MDI существует только одна строка формул для обработки всех открытых книг в этом экземпляре Excel. В SDI есть одна строка формул для каждой книги. Для SDI при редактировании перекрестных ссылок в формуле строки формул исходной и целевой книги будут отображать формулу, редактируемую в настоящее время, как показано на рис. 5.

Рис. 5. Обновление формул, присутствующих в нескольких книгах

Обновление формул, присутствующих в нескольких книгах

Пользовательские области задач

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

Подводя итоги, разработчику потребуется следующее:

  • Убедитесь, что для всех книг, в которых требуется отобразить настраиваемую область задач, необходимо написать код, чтобы сделать это явным образом.
  • Убедитесь, что вы явно обработали обновление пользовательского состояния области задач во всех экземплярах, если требуется, чтобы все настраиваемые области задач отражали одно и то же состояние. Например, флажок установлен пользователем в значение Включено, и вы хотите, чтобы он отображался во всех настраиваемых панелях задач во всех экземплярах Excel.

Пользовательские ленты

Пользовательские вкладки ленты и элементы управления, которые предполагали один пользовательский интерфейс ленты для каждого экземпляра приложения в предыдущих версиях Excel, теперь будут распространяться на каждую ленту книги в Excel. В то время как в MDI разработчику пользовательской ленты не нужно было учитывать несколько экземпляров своих элементов управления в разных экземплярах пользовательского интерфейса ленты Excel, при использовании SDI необходимо учитывать эту ситуацию.

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

  • Убедитесь, что код может циклически перемещаться по окнам книги и обновлять состояние элементов управления.

ИЛИ

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

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

Рекомендации по коду VBA

При переходе на SDI все методы, события и свойства окна уровня приложения Excel остаются неизменными и работают так, как в предыдущих версиях Excel (например, Application.ActiveWindow, Application.Windowsи т. д.).

В Excel все методы, события и свойства окна на уровне книги теперь работают в окне верхнего уровня (например, Workbook.WindowActivate событие по-прежнему активируется при переключении на определенную книгу, Workbook.Resize событие по-прежнему активируется при изменении размера книги, а ThisWorkbook.Windows(1).Height, ThisWorkbook.Windows(1).Width, ThisWorkbook.Windows(1).Left, ThisWorkbook.Windows(1).Right, ThisWorkbook.Windows(1).MinimizeThisWorkbook.Windows(1).Maximize и т. д. будет работать в окне верхнего уровня для активной книги).

Особые случаи перечислены в следующей таблице.

Таблица 1. Поведение объектной модели с помощью SDI

Функция Описание Последствия SDI
Application.Visible Возвращает или задает логическое значение, определяющее, является ли объект видимым. Для чтения и записи. Если все окна скрыты:
  • Application.Visible становится false

  • При установке параметра Application.Visible в значение True отображаются все скрытые окна

  • При открытии документа через оболочку отображается только то, что окно и Application.Visible теперь имеет значение True

Также:
  • Application.Visible = False скрывает все, а Application.Visible = True отображает все, игнорируя все параметры уровня документа.

  • Если все окна скрыты с помощью параметра уровня окна, то параметр уровня приложения также переключается

  • Отображение хотя бы одного окна означает, что для параметра уровня приложения задано значение True.

Application.ShowWindowsInTaskbar Значение true , если для каждой открытой книги есть отдельная кнопка панели задач Windows. Значение по умолчанию — True. Для чтения и записи, Boolean. Этот параметр не рекомендуется использовать в Excel.
Application.Caption Возвращает или задает строковое значение, представляющее имя, отображаемое в строке заголовка главного окна Microsoft Excel. Обновления все окна для этого экземпляра Excel.
Application.Hwnd Возвращает значение Long , указывающее дескриптор окна Верхнего уровня окна Microsoft Excel. Только для чтения. Возвращает дескриптор активного окна.
Application.FormulaBarHeight Позволяет пользователю указать высоту строки формул в строках. Для чтения и записи, Long. Работает в активном окне книги; не все окна для этого экземпляра Excel.
Application.DisplayFormulaBar Значение True , если отображается строка формул. Для чтения и записи, Boolean. Работает во всех окнах для этого экземпляра Excel.
Workbook.Windows Возвращает коллекцию Windows, представляющую все окна в указанной книге. Объект Windows, доступный только для чтения. Нет изменений в поведении. Возвращает коллекцию окон для этой книги, таких как области задач, дополнительные представления.
Workbook.WindowResize Происходит при изменении размера любого окна книги. Нет изменений в поведении. Активируется при изменении размера окна книги (верхнего уровня).
Window.Caption Возвращает или задает значение Variant , представляющее имя, которое отображается в строке заголовка окна документа. Нет изменений в поведении.
Workbook.Protect(Password, Structure, Windows) Защищает книгу, чтобы ее нельзя было изменить. Независимо от значения параметра Windows (True или False), защита структуры окна не будет включена. Ошибка среды выполнения не отображается, если задано значение True , но эта часть вызова процедуры вернет NO-OP.

Примечание.

В пользовательском коде не требуется никаких изменений, чтобы команды XLM продолжали работать должным образом в SDI Excel.

Нерекомендуемая защита книги Windows

В SDI каждая книга имеет собственное окно верхнего уровня, которое можно восстановить, свернуть и закрыть. Чтобы свести к минимуму путаницу, которая может возникнуть при отсутствии перемещения, изменения размера или закрытия этого окна верхнего уровня, параметр Windows в функции "Защита книги" в Excel больше недоступен (см. рис. 6). В таблице 2 описано это действие.

Рисунок 6. Параметр Windows диалогового окна "Защита книги" отключен

Опция Windows в диалоговом окне

Действие Поведение
Открытие книги, созданной в более ранней версии Excel, с включенной защитой окон Excel распознает расположение и атрибуты размера окна, но не помешает пользователю упорядочить или закрыть эти окна.
Просмотр диалогового окна Защита структуры и Windows В Excel появится диалоговое окно, но параметр Windows отключен.

Решения проблем SDI

В следующем разделе приведены обходные пути для проблем, которые могут возникнуть при использовании SDI.

  • Невозможно закрыть книгу, нажав красную кнопку "X" Закрыть , если она открывается программным способом через модальную форму пользователя. Чтобы обойти эту проблему, рекомендуется добавить следующий код в процедуру события макета пользовательской формы, а затем открыть пользовательную форму как нережимую.

      Private Sub UserForm_Layout()
          Static fSetModal As Boolean
          If fSetModal = False Then
              fSetModal = True
              Me.Hide
              Me.Show 1
          End If
      End Sub
    

    Другой вариант — открыть окно книги, активировать любое другое окно, а затем повторно активировать окно книги. Теперь вы сможете закрыть книгу с помощью кнопки Закрыть .

  • Предположим, что код VBA открывает несколько книг и использует свойство DataEntryMode для управления вводом данных и закрытием книг. В модели SDI Excel, так как каждая книга содержится в своем собственном процессе, свойство DataEntryMode, используемое в одной книге, не распознает существование другой книги и, следовательно, практически не влияет на их взаимодействие. Чтобы обойти эту проблему, существует несколько вариантов. Дополнительные книги или листы можно скрыть с помощью Window.Visible = False или Sheet.Visible = Falseсоответственно. Обнаруживайте и отменяйте все события закрытия с помощью Workbook.BeforeClose(Cancel) = True.

  • Панели инструментов, добавленные в книги Excel с помощью кода панели команд и XLA-файлов, не будут отображаться до закрытия и повторного открытия книги. Использование панели команд для настройки пользовательского интерфейса стало нерекомендуемой начиная с Excel 2007. Оптимальным решением является настройка пользовательского интерфейса ленты с помощью XML-файлов, как подробно описано в статье Настройка ленты Office Fluent 2007 для разработчиков

    Другой вариант — использовать событие уровня приложения для обнаружения новых открывающихся книг, а затем использовать Application.Windows вместо книг для добавления элемента управления ленты. Ниже приведен пример кода, который можно использовать для этого.

      Private Sub Workbook_Open()
          ToolBarsAdd
      End Sub
    
      Sub ToolBarsAdd()
          Dim oBar As CommandBar
    
          ToolBarsDelete
          Set oBar = Application.CommandBars.Add(Name:="MyToolBar")
          '
          With oBar
              With .Controls.Add(Type:=msoControlButton)
                  .OnAction = "SayHello"
                  .FaceId = 800
              End With
          End With
          oBar.Visible = True
      End Sub
    
      Sub SayHello()
          MsgBox "Hello from '" & ActiveWorkbook.Name & "'"
      End Sub
    

    Следующий код будет использоваться для удаления панели инструментов перед закрытием книги.

      Private Sub Workbook_BeforeClose(Cancel As Boolean)
          ToolBarsDelete
      End Sub
    
      Sub ToolBarsDelete()
      Dim wnd As Window
      On Error Resume Next
          For Each wnd In Application.Windows
              wnd.Activate
              Application.CommandBars("MyToolBar ").Delete
          Next wnd
      End Sub
    
  • В Excel 2010 немодерная пользовательская форма по умолчанию отображается как окно верхнего уровня поверх всех окон Excel. В Excel 2013 немодерная пользовательская форма отображается только поверх окна книги, которое было активно при отображении пользовательской формы. Excel Most Valuable Professional (MVP) Ян Карел Питерс предоставляет объяснение проблемы и решение на своей веб-странице по адресу https://www.jkp-ads.com/articles/keepuserformontop.asp.

Аннотация

Новый интерфейс с одним документом в Excel 2013 упрощает работу с несколькими книгами. Для удобства можно даже перетащить книги на различные мониторы. Вам просто нужно помнить, что в каждой книге есть только одно окно верхнего уровня и одно меню пользовательского интерфейса ленты. Для этого может потребоваться обновить любой существующий код, чтобы кэшировать состояние элементов управления и параметров при переходе из книги в книгу.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.