Программирование для интерфейса с одним документом в Excel
Узнайте о рекомендациях по программированию для интерфейса с одним документом в Excel.
Сравнение интерфейсов с одним и несколькими документами в Excel 2010 и Excel 2013
Новая функция в Excel 2013 — интерфейс с одним документом (SDI). SDI — это метод организации приложений графического пользовательского интерфейса по отдельным окнам, которые диспетчер окон операционной системы обрабатывает отдельно. В Excel 2013 каждое окно Excel может содержать только одну книгу, и каждое из них имеет собственный пользовательский интерфейс ленты (см. рис. 1). По умолчанию при открытии новой книги она будет отображаться в другом окне Excel, даже если это тот же экземпляр Excel.
Рис. 1. Интерфейс с одним документом в Excel 2013
Это контрастирует с интерфейсом С несколькими документами (MDI), в котором одно родительское окно используется для размещения нескольких вложенных дочерних окон, при этом только родительское окно имеет меню или панель инструментов. В Excel 2010 каждая книга в одном экземпляре Excel использует общий пользовательский интерфейс ленты (см. рис. 2).
Рис. 2. Интерфейс с несколькими документами в Excel 2010
Excel 2010 использует MDI, что означает, что существует одно окно уровня приложения, в котором хранятся все книги, открытые в конкретном экземпляре Excel. Окна книги можно упорядочить в окне приложения Excel, при этом все они совместно работают в одном пользовательском интерфейсе ленты. SDI в Excel означает, что каждая книга будет иметь собственное окно приложения верхнего уровня и собственный пользовательский интерфейс ленты.
Примечание.
В Excel нет параметра совместимости MDI.
В системах с двумя мониторами SDI в Excel позволяет параллельно сравнивать две книги, перетаскивая каждую книгу на другой монитор. Каждая книга работает независимо от другой.
Чтобы увидеть SDI и MDI в действии, если у вас есть excel 2010 и Excel 2013, выполните следующие действия.
Сравнение количества процессов для интерфейсов MDI и SDI
- В меню "Пуск" Windows запустите Excel 2010.
- Запустите второе вхождение Excel. Убедитесь, что отображаются два окна Excel.
- На панели задач Windows выберите и выберите Запустить диспетчер задач.
- Перейдите на вкладку Процессы и прокрутите вниз, пока не увидите две записиExcel.exe . Это говорит о том, что по умолчанию Excel открывает новый экземпляр при каждом вызове (два экземпляра Excel).
- Закройте два экземпляра Excel.
- В меню "Пуск" Windows выберите Excel 2013.
- Запустите второе вхождение Excel. Убедитесь, что отображаются два окна Excel.
- Снова запустите диспетчер задач.
- На вкладке Процессы прокрутите вниз, пока не увидите Excel.exe. Имейте в виду, что хотя вы открыли два экземпляра Excel, две книги содержатся в одном экземпляре Excel.
Чтобы узнать, как работают SDI и MDI в экземпляре Excel, выполните следующие действия.
Сравнение количества экземпляров Excel для интерфейсов MDI и SDI
- В меню "Пуск" Windows выберите Excel 2010.
- Выберите окно Excel, чтобы сделать его активным, и убедитесь, что Book1 является текущей книгой.
- Нажмите клавиши CTRL+N, чтобы открыть другую книгу. Убедитесь, что Book2 теперь является текущей книгой.
- Свернуть Book2 , а затем см. раздел Book1. Обе книги содержатся в одном экземпляре Excel.
- Закройте Excel.
- В меню "Пуск" Windows выберите Excel 2013.
- Выберите окно Excel, чтобы сделать его активным, и убедитесь, что Book1 является текущей книгой.
- Нажмите клавиши CTRL+N, чтобы открыть другую книгу. Убедитесь, что Book2 открыта в отдельном окне (но все равно в том же экземпляре Excel).
- Закройте Excel.
Примечание.
Вы можете открыть несколько экземпляров Excel с помощью следующего параметра командной строки: excel.exe /x. Этот параметр запускает Excel в новом процессе.
В этой статье мы обсудим реализацию SDI в пользовательском интерфейсе Excel и ее влияние на программируемость в Excel.
Что изменилось в пользовательском интерфейсе
Если вы внимательно посмотрите после открытия книги Excel, вы больше не увидите кнопки состояния окна ( свернуть, развернуть и восстановить) в правом верхнем углу ленты. На рисунке 3 показаны кнопки состояния окна, доступные в Excel и Excel 2007. Так как окно верхнего уровня теперь привязано непосредственно к одной книге или представлению книги, в пользовательском интерфейсе управления Windows в Excel больше не требуется.
Рис. 3. Элементы интерфейса Windows в Excel 2010
Кроме того, начиная с Excel, в одном окне экземпляра Excel больше нет нескольких окон книг, как показано на рис. 4.
Рис. 4. Несколько книг в одном окне экземпляра 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).Minimize
ThisWorkbook.Windows(1).Maximize
и т. д. будет работать в окне верхнего уровня для активной книги).
Особые случаи перечислены в следующей таблице.
Таблица 1. Поведение объектной модели с помощью SDI
Функция | Описание | Последствия SDI |
---|---|---|
Application.Visible |
Возвращает или задает логическое значение, определяющее, является ли объект видимым. Для чтения и записи. | Если все окна скрыты:
|
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 диалогового окна "Защита книги" отключен
Действие | Поведение |
---|---|
Открытие книги, созданной в более ранней версии 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 упрощает работу с несколькими книгами. Для удобства можно даже перетащить книги на различные мониторы. Вам просто нужно помнить, что в каждой книге есть только одно окно верхнего уровня и одно меню пользовательского интерфейса ленты. Для этого может потребоваться обновить любой существующий код, чтобы кэшировать состояние элементов управления и параметров при переходе из книги в книгу.
См. также
- Откройте книги Excel в отдельных окнах и просматривайте их рядом
- Интерфейс одного документа Excel 2013 (SDI): перестроение областей задач для поддержки
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по