Обмен информацией между документами
Когда речь идет о системе документов, то один из основных вопросов - организация обмена информацией между отдельными документами системы. Когда речь идет о системе проектов, то, как правило, существует сравнительно небольшая по объему общая информация, которая используется во всех проектах. Сейчас мы и поговорим о том, как организовать такой общий информационный пул, содержащий глобальную информацию уровня системы проектов. Задача состоит в том, чтобы хранимые данные могли быть доступны во всех проектах для чтения и записи. Решить задачу можно по-разному, перечислим основные способы:
- Выделим один из проектов, который будем называть основным, и в стандартном модуле этого проекта зададим множество Public переменных, в совокупности и определяющих общую для всей системы информацию. Систему документов спроектируем так, чтобы их проекты были связаны по ссылке, и корнем дерева был основной документ, хранящий глобальную информацию. В этом случае каждый проект будет иметь доступ к этой информации. Напомним, циклические ссылки между проектами не разрешены, отсюда следует, что нельзя часть информации поместить в проект А, часть в проект В и сделать эту информацию общедоступной для обоих проектов. Возможна только древесная организация хранения общей информации. Самая общая информация хранится в корневом проекте, в "дочерних" проектах хранится информация необходимая потомкам этих дочерей, и так до терминальных проектов.
- Второй способ состоит в том, что общая для всех проектов информация размещается в виде списков Excel, в ячейках выделенной рабочей книги, играющей роль основного документа. Этот способ основан на том, что не только VBA обеспечивает взаимодействие проектов, возможно взаимодействие самих документов, ссылки между ними. Известно, что ссылки на ячейки книги Excel допустимы и широко распространены. Так что страницы Excel часто используются как удобное средство для передачи информации между документами. Чуть ниже на примере мы продемонстрируем этот способ передачи информации.
Достоинство этого способа состоит и в том, что проекты могут и не быть связанными ссылками, более того, возможен взаимный обмен информацией. - Классическим способом хранения общей информации, особенно, в больших объемах, являются базы данных. Поэтому базу данных Access также можно использовать для организации информационного пула системы проектов.
- Для полноты картины упомянем обычный файл.
Заканчивая обсуждение этого вопроса, еще раз подчеркнем, что способ передачи информации между проектами, основанный на общем информационном пуле, как и во всех случаях работы с глобальными переменными, является опасным. Поэтому объем этой информации не должен быть большим и легко контролируемым, так что по этим соображениям первые два способа являются наиболее предпочтительными, а программисты, скорее всего, выберут первый из них. В заключение, напомним, что передача информации между проектами через общую область важный, но не единственный способ организации взаимодействия. Основным и надежным способом передачи данных для программистов является вызов Public методов проекта, - передача им аргументов и получение результатов, то, что называется аппаратом формальных - фактических параметров.
Перейдем теперь к примерам организации взаимодействия системы документов. Один из примеров на эту тему мы уже приводили в предыдущей лекции. Возможно, стоит еще раз обратиться к нему и разобрать, как из документа Word происходит переключение на работу с рабочей книгой Excel и базой данных Access. Приведем еще один пример, где показано, как пользователь делает выбор между тремя документами - рабочими книгами Excel. Этот пример также демонстрирует возможность доступа из проекта, связанного с одной рабочей книгой, к информации, записанной в ячейках другой рабочей книги. Взгляните на то, как выглядит исходный документ при его открытии.
Рис. 2.6. Открытие рабочей книги, содержащей ссылки
Поскольку в данной рабочей книге есть ссылки на другие рабочие книги, то при открытии документа появляется сообщение о том, что, возможно, следует обновить документ, поскольку после его закрытия могли измениться документы, на которые он ссылается.
На листе рабочей книги нашего примера расположена командная кнопка с надписью "ChooseBook". Эту кнопку пользователь должен нажать в тот момент, когда он стоит на распутье, и должен выбрать, с какой следующей книгой он хочет работать. Вот текст обработчика события "Click":
Пример 2.3.
(html, txt)
Пользователю предоставляется право выбора одной из трех рабочих книг. Если выбранная книга уже открыта, то она активизируется, в противном случае она предварительно открывается. Полагаем, что комментарии, приведенные в программном тексте достаточны для понимания работы этой процедуры. Приведем еще один фрагмент кода, - макрос, вызываемый в ответ на щелчок другой кнопки нашего документа. В этом макросе печатаются значения ячеек из нескольких рабочих книг. Несмотря на его простоту, он в полной мере демонстрирует возможность использования Excel для хранения общей информации системы проектов. Можно видеть, что доступ к информации не представляет трудностей.
Public Sub PrintGlobal() Dim MyrOne As Range, MyrTwo As Range, MyrThree As Range
Debug.Print ("Работает процедура PrintOne") Debug.Print ("Печать глобальных переменных") Debug.Print (One & "-" & Two & "-" & Three)
Debug.Print ("Допустимы ссылки на ячейки различных рабочих книг!") Set MyrOne = Range("[BookOne.xls]Sheet1!D1") Debug.Print MyrOne Set MyrTwo = Range("[BookTwo.xls]Sheet1!D1") Debug.Print MyrTwo Set MyrThree = Range("[BookThree.xls]Sheet1!D1") Debug.Print MyrThree MsgBox ("Everything is OK! Look at Immediate Window") End Sub
Вот результаты отладочной печати в конце работы этой процедуры:
Работает процедура PrintOne Печать глобальных переменных My value is One -My value is One -My value is One Допустимы ссылки на ячейки различных рабочих книг! BookOne BookTwo BookThree
Всем глобальным переменным предварительно было присвоено одно и то же значение. Книги BookOne, BookTwo, BookThree.xls на первой странице в ячейке D1 хранят свои названия, их и печатает наша процедура, вызываемая в проекте одной из этих книг.
Можно видеть, что доступ к информации не представляет трудностей.
Public Sub PrintGlobal() Dim MyrOne As Range, MyrTwo As Range, MyrThree As Range
Debug.Print ("Работает процедура PrintOne") Debug.Print ("Печать глобальных переменных") Debug.Print (One & "-" & Two & "-" & Three)
Debug.Print ("Допустимы ссылки на ячейки различных рабочих книг!") Set MyrOne = Range("[BookOne.xls]Sheet1!D1") Debug.Print MyrOne Set MyrTwo = Range("[BookTwo.xls]Sheet1!D1") Debug.Print MyrTwo Set MyrThree = Range("[BookThree.xls]Sheet1!D1") Debug.Print MyrThree MsgBox ("Everything is OK! Look at Immediate Window") End Sub
Вот результаты отладочной печати в конце работы этой процедуры:
Работает процедура PrintOne Печать глобальных переменных My value is One -My value is One -My value is One Допустимы ссылки на ячейки различных рабочих книг! BookOne BookTwo BookThree
Всем глобальным переменным предварительно было присвоено одно и то же значение. Книги BookOne, BookTwo, BookThree.xls на первой странице в ячейке D1 хранят свои названия, их и печатает наша процедура, вызываемая в проекте одной из этих книг.