Виталий Сизов

программист, специалист по разработке на платформе Microsoft Office для Web (Visual Basic for Applications, JavaScript),
sva@hot.ee

Напомним, что Digital Dashboard - это ключевой элемент новейшей информационной технологии Microsoft, обеспечивающей быстрое создание систем управления предприятиями. Digital Dashboard представляет собой рабочее место руководителей, бизнесменов и других лиц, принимающих решения.

Технически Digital Dashboard - это Web-страница или сайт, что позволяет объединять на одном экране разнородную информацию, полученную из различных источников: персонального компьютера, LAN предприятия, корпоративной интрасети или Интернета. Гипертекстовые документы идеально подходят для этой цели, сочетая низкую стоимость разработки с практически неограниченными возможностями.

Но Digital Dashboard - это не простые Web-страницы, к которым мы привыкли, путешествуя по Сети. Каждая Digital Dashboard состоит из множества небольших окон, способных раскрываться и сворачиваться, не перекрывая друг друга. Такие окна называются Web Parts; как правило, это объекты - элементы управления ActiveX.

Страницы Digital Dashboard не предназначены для отображения в обычных браузерах, таких как Internet Explorer или Netscape Communicator. Это связано с тем, что объекты в Web Parts связаны с такими источниками информации, как электронные таблицы и графики Excel, базы данных SQL, Pivot Table и многомерные массивы OLAP. Все это требует на стороне клиента поддержки со стороны ОС Windows 2000, Microsoft Office 2000, SQL Server и Exchange Server. Другими словами, Digital Dashboard - это специальные корпоративные Web-страницы, предназначенные для особого круга пользователей, оснащенных компьютерами с необходимым ПО. Такое решение позволяет разрабатывать эти страницы, используя весь арсенал средств Microsoft, без оглядки на совместимость с другими программными платформами.

Функции шлюза между Web-страницей и ПО Microsoft выполняет Outlook 2000, добавляя ко всему многообразию компонентов Digital Dashboard собственные объекты Application - электронную почту, календарь, контакты и задачи. Именно в этом приложении открываются страницы Digital Dashboard, подменяя собой Outlook Today или HTML-представления папок.

Несмотря на простоту, для изготовления Digital Dashboard, кроме упомянутых Windows 2000, Office 2000, SQL Server и Exchange Server, требуются специальные инструментальные средства. Это система программирования Visual InterDev (а в ближайшем будущем и VB.NET) и собственно Digital DashboardRK - набор Web Parts, дополнений Add-Ins, документации и примеров. Для приобретения и установки всего этого потребуются немалые средства.

Попробуем проанализировать, в чем же заключается основное преимущество новой технологии, сделавшей ее столь привлекательной. Если отбросить все следствия, то окажется, что в основе лежит идея совмещения двух мощных инструментов: гипертекстовых документов и приложений Office. Первый из них обеспечивает универсальный интерфейс, а второй - обработку и хранение данных.

Внедренный Web-браузер

Совместить гипертекст и Microsoft Office относительно просто. Microsoft Outlook 2000 служит контейнером для объектов библиотеки SHDOCVW.DLL. С помощью методов этих объектов отображаются Web-страницы. А ведь эти объекты не что иное, как известные элементы управления Microsoft Internet Controls. В любой системе программирования, предусматривающей подключение внешних DLL и элементов управления ActiveX, всегда можно найти и добавить ссылку на эту библиотеку. Более того, непосредственно на рабочую поверхность документов Word или листов Excel можно внедрить элемент управления WebBrowser. Так, для Excel из русской версии Microsoft Office'97 на панели инструментов "Элементы управления" достаточно нажать кнопку "Дополнительные элементы" и в открывшемся списке выбрать "Обозреватель веб-страниц Microsoft". В результате в ячейке окажется формула =ВНЕДРИТЬ("Shell.Explorer.2";""), а на странице появится черный прямоугольник с эмблемой Microsoft Windows. Тем самым мы превратили лист Excel в такой же контейнер для SHDocVw, как и Outlook'2000.

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

Fig.1
Рис. 1. Excel в качестве Web-браузера.

Следует отметить, что панель инструментов, показанная на рис. 1, - это не стандартная панель Web офисных приложений, хотя и заимствует те же иконки на командных кнопках. Использовать стандартную панель для внедренного браузера не годится, так как встроенные команды воздействуют на внешний браузер Internet Explorer или приложения Office, определяемые по гиперссылкам.

К счастью, внедренный объект WebBrowser имеет методы, полностью соответствующие типичным командным кнопкам любого браузера. Это методы GoBack, GoForward, Stop, Refresh и GoHome. Последний из перечисленных методов, GoHome, вряд ли целесообразно использовать. Стартовая страница для Internet Explorer скорее всего не должна быть страницей Digital Dashboard, тем более что мы собираемся наделить Digital Dashboard специфическими возможностями, которые не поддерживает обычный браузер. В таком случае макрос для кнопки "Домашняя страница" может выглядеть следующим образом.

Const HOMEPAGE As String = 
"file:///C:/MyDigital Dashboard/index.html"

Public Sub GoHome()
  Dim objWB As WebBrowser
  Set objWB = ThisWorkbook.Worksheets(1).WebBrowser1
  If ActiveWorkbook.Name <> ThisWorkbook.Name Then
    ThisWorkbook.Activate
    ThisWorkbook.Worksheets(1).Activate
  End If
  objWB.Navigate HOMEPAGE

End Sub

Обратите внимание, как просто задается адрес Digital Dashboard. Достаточно описать его где-нибудь отдельно и менять по мере необходимости. Как это непохоже на фиксацию адреса Digital Dashboard в Outlook 2000, требующую корректировки системного реестра!

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

With Application
  For Each objCBar In CommandBars
    If objCBar.Visible And _
       objCBar.Name <> "Worksheet Menu Bar" Then
      objCBar.Visible = False
    End If
  Next
End With

Последний штрих подготовки браузера может заключаться в установке размеров окна для внедренного объекта, в зависимости от возможностей контейнерного приложения. Такую конструкцию следует предусмотреть в процедуре обработки события Workbook_Open().

With ThisWorkbook.Worksheets(1).OLEObjects(1)
  If .Height <> Application.UsableHeight Then
    .Height = Application.UsableHeight
  End If
  If .Width <> Application.UsableWidth Then
    .Width = Application.UsableWidth
  End If
End With

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

Внимательный читатель может заметить отсутствие на панели инструментов привычных ComboBox для ручного ввода адреса Web-страниц и меню "Избранное". Не стоит забывать, однако, что цель нашей работы - создание рабочего места со строго регламентированными возможностями, а не универсального приложения на все случаи жизни.Обычно в Digital Dashboard для хранения ссылок используется специальное окно Web Part, разработанное исходя из конкретных потребностей. Кроме того, как поле для ввода адреса, так и любое меню не так уж трудно реализовать средствами Microsoft Office.

Взаимодействие с Visual Basic for Applications

Итак, первую ключевую идею новой технологии мы воплотили. Теперь в любой разработке на базе Microsoft Office можно использовать гипертекстовые документы с информацией из Интернета и интрасети. На рис. 2 показан фрагмент страницы, выполненной в стиле Digital Dashboard с настоящим объектом - Investor Ticker и самодельным окном - Web Part для поиска в Интернете.

Fig.2
Рис. 2. Фрагмент Digital Dashboard, открытой в Excel.

Остается решить вторую задачу - обеспечить взаимодействие HTML-документа с Visual Basic for Applications. Если такое взаимодействие станет возможным, то откроется неограниченный доступ практически ко всем ресурсам локальной вычислительной системы.

Сначала проанализируем, что мы имеем. В приложении (объект Application) Excel открыт документ (объект Workbook), на одном из листов которого (объект Worksheet) имеется объект WebBrowser. У этого объекта, наряду со свойствами и методами, имеется целый ряд событий, позволяющих создавать VBA-процедуры - обработчики. В этом легко убедиться, открыв окно программы для соответствующего листа и выбрав в ComboBox объект WebBrowser1. В окне процедур для этого объекта сразу же появится список предусмотренных событий (на сегодняшний день -два десятка). При этом практически все процедуры обработки событий получают от источника некоторые параметры, содержащие сведения о HTML-документе. В нашем случае интерес представляют только такие события, параметры которых можно задавать произвольно и желательно в форме строковых выражений. Таких событий гораздо меньше, а именно два. Это события StatusTextChange(Text As String) и BeforeNavigate2(pDisp As Object, URL, Flags, TargetFrameName, PostData, Headers, Cancel As Boolean).

Событие StatusTextChange обладает всеми необходимыми качествами. Его легко инициировать в HTML-документе, а вызов содержит единственный параметр в виде строки, которую можно задать произвольно. Его недостаток заключается в том, что при единственном вызове Window.Status в источнике событие в обработчике возникает многократно, что может привести к непредсказуемым последствиям.

Остается только одно подходящее событие - BeforeNavigate2, с параметром URL типа Variant. Это событие возникает всякий раз, когда на странице выполняются действия, влекущие за собой переход по гиперссылке. Что может быть удобнее? Не надо писать никаких команд JavaScript, достаточно только включить нужное строковое выражение в любое место HTML-документа, допускающее указание перехода по URL. Процедура Visual Basic for Applications - перехватчик события немедленно получит эту информацию.

Естественно, нужно позаботиться о том, чтобы сообщения для VISUAL BASIC FOR APPLICATIONS отличались от настоящих адресов URL. Ведь браузер не просто использует первую попавшуюся строку. Перед обработкой неполные IP-адреса расширяются до полных, к адресу добавляется тип протокола (например, http или file), пробелы заменяются специальными кодами, в некоторых случаях добавляются параметры.

В этой ситуации хорошим решением может оказаться следующий синтаксис:

vba:имя_процедуры(параметр1,…,параметрN). 

Желательно, чтобы такая строка не содержала пробелов и специальных символов. Префикс "vba:" обеспечивает очень простой способ перехвата обращений к Visual Basic for Applications из потока URL. А наличие параметра Cancel в вызове перехватчика события BeforeNavigate2 обеспечивает идеальный механизм взаимодействия, прекращающий операцию для всех URL с префиксом "vba:" и оставляющий все без изменений для иных вариантов.

Ниже приводится HTML-документ, иллюстрирующий описанный механизм взаимодействия тремя различными способами, с помощью таких широко применяемых на практике элементов управления страницами, как форма, гиперссылка и событие onClick для рисунка. В примере предполагается, что необходимо вызвать процедуру Visual Basic for Applications с именем setcolor и единственным параметром, задающим требуемый цвет.

<HTML>
<HEAD>
<TITLE>Примеры вызова VBA</TITLE>
</HEAD>
<BODY>

<form action="vba:setcolor(red)">
<input type=submit value="Click Me.">
</form>

<A HREF="vba:setcolor(blue)">ClickMe</A>

<IMG SRC="Image81.gif" WIDTH="100" HEIGHT="56" BORDER=0
onClick='document.location="vba:setcolor(#c0c0c0)"'>
</BODY>
</HTML>

Соответствующая процедура - перехватчик события показана ниже. В ней осуществляется проверка префикса, выделение единственного параметра и вызов процедуры setcolor.

Private Sub WebBrowser1_BeforeNavigate2(ByVal _
            pDisp As Object, _
            URL As Variant, _
            Flags As Variant, _
            TargetFrameName As Variant, _
            PostData As Variant, _
            Headers As Variant, _
            Cancel As Boolean)
  Dim strParam As String
  Dim intBegParm As Integer
  Dim intEndParm As Integer
  
  If Left(URL, 4) = "vba:" Then
    Cancel = True
    If Left(URL, 12) = "vba:setcolor" Then
      intBegParm = InStr(1, URL, "(") + 1
      intEndParm = InStr(1, URL, ")")
      strParam = Mid(URL, intBegParm, _
                 intEndParm - intBegParm)
      setcolor strParam
    End If
  End If

End Sub

Но мы сделали только половину дела. Документы в формате HTML теперь могут вызывать процедуры Visual Basic for Applications так же просто, как и функции на "родных" языках JavaScript и Visual Basic Scripting Edition. Безусловно, это само по себе важное достижение. Однако хотелось бы обеспечить и обратную связь, тем более что такое взаимодействие уже реализовано на уровне объекта WebBrowser, являющегося контейнером для HTML-документов.

Для решения обратной задачи понадобится объектная модель HTML-документа. Тут на выручку приходит библиотека Microsoft HTML Object Library (MSHTML.tlb). Именно эта библиотека используется в JavaScript для Internet Explorer; здесь есть все необходимое для создания динамических Web-страниц. Чтобы подключить эту библиотеку к проекту Visual Basic for Applications, нужно добавить соответствующую ссылку с помощью команды редактора "Сервис.Ссылки…".

Теперь в Visual Basic for Applications можно реализовать любую процедуру, непосредственно воздействующую на многочисленные объекты открытого HTML-документа. Например, функция setcolor, упомянутая в предыдущих примерах, может выглядеть следующим образом.

Private Sub setcolor(strColor As String)
  Dim oHTML As HTMLDocument
  Set oHTML = WebBrowser1.Document
  oHTML.BGColor = strColor
  ActiveSheet.Range("color").Value = strColor
End Sub

s

Последняя команда подчеркивает, что мы не только сумели вызвать из HTML-документа процедуру Visual Basic for Applications, которая поменяла цвет фона в вызывающем документе, но и записали некоторую информацию во внешний документ (в данном случае в ячейку Excel), а это принципиальное отличие Digital Dashboard от "безопасных" Web-страниц, открываемых в обычных браузерах.

Итак, цель достигнута. Теперь Web-страницы могут стать равноправными составляющими любых офисных приложений. И не беда, что мы не располагаем системой программирования Visual InterDev c интеллектуальной поддержкой объектной модели HTML. Такую же интеллектуальную поддержку нам обеспечит редактор Visual Basic for Applications. Зато на страницах Digital Dashboard мы сможем использовать все элементы управления Microsoft Office: например, отображать полноценные формы ввода или контекстные меню в позициях HTML-документа, где пользователь щелкнул мышью. А что касается профессиональных Web Parts, то их всегда можно добавить позднее, когда они окажутся под рукой.