Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 1....doc
Скачиваний:
59
Добавлен:
17.12.2018
Размер:
1.88 Mб
Скачать

Как организуются ссылки между проектами

Рассмотрим теперь технический вопрос, как организовать ссылку из проекта B на проект A. Для этого нужно сделать две вещи, во-первых, дать собственные имена проектам, во-вторых, - включить ссылку в проекте B на проект A. Имя нужно дать, по крайней мере, родительскому проекту A. О том, как это делается, мы уже рассказали в разделе "Свойства проекта" этой лекции. На рис. 2.2 показано соответствующее диалоговое окно.

Задание ссылки выполняется также стандартным образом. В окне Редактора Visual Basic нужно выбрать соответствующий проект, в нашем примере проект B, и из меню Tools выбрать команду References. Если документ, содержащий проект A открыт, то в окне ссылок наряду с другими возможными для ссылок компонентами появится флажок с именем проекта A, останется только его включить.

Обмен информацией между документами

Когда речь идет о системе документов, то один из основных вопросов - организация обмена информацией между отдельными документами системы. Когда речь идет о системе проектов, то, как правило, существует сравнительно небольшая по объему общая информация, которая используется во всех проектах. Сейчас мы и поговорим о том, как организовать такой общий информационный пул, содержащий глобальную информацию уровня системы проектов. Задача состоит в том, чтобы хранимые данные могли быть доступны во всех проектах для чтения и записи. Решить задачу можно по-разному, перечислим основные способы:

  • Выделим один из проектов, который будем называть основным, и в стандартном модуле этого проекта зададим множество Public переменных, в совокупности и определяющих общую для всей системы информацию. Систему документов спроектируем так, чтобы их проекты были связаны по ссылке, и корнем дерева был основной документ, хранящий глобальную информацию. В этом случае каждый проект будет иметь доступ к этой информации. Напомним, циклические ссылки между проектами не разрешены, отсюда следует, что нельзя часть информации поместить в проект А, часть в проект В и сделать эту информацию общедоступной для обоих проектов. Возможна только древесная организация хранения общей информации. Самая общая информация хранится в корневом проекте, в "дочерних" проектах хранится информация необходимая потомкам этих дочерей, и так до терминальных проектов.

  • Второй способ состоит в том, что общая для всех проектов информация размещается в виде списков Excel, в ячейках выделенной рабочей книги, играющей роль основного документа. Этот способ основан на том, что не только VBA обеспечивает взаимодействие проектов, возможно взаимодействие самих документов, ссылки между ними. Известно, что ссылки на ячейки книги Excel допустимы и широко распространены. Так что страницы Excel часто используются как удобное средство для передачи информации между документами. Чуть ниже на примере мы продемонстрируем этот способ передачи информации. Достоинство этого способа состоит и в том, что проекты могут и не быть связанными ссылками, более того, возможен взаимный обмен информацией.

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

  • Для полноты картины упомянем обычный файл.

Заканчивая обсуждение этого вопроса, еще раз подчеркнем, что способ передачи информации между проектами, основанный на общем информационном пуле, как и во всех случаях работы с глобальными переменными, является опасным. Поэтому объем этой информации не должен быть большим и легко контролируемым, так что по этим соображениям первые два способа являются наиболее предпочтительными, а программисты, скорее всего, выберут первый из них. В заключение, напомним, что передача информации между проектами через общую область важный, но не единственный способ организации взаимодействия. Основным и надежным способом передачи данных для программистов является вызов Public методов проекта, - передача им аргументов и получение результатов, то, что называется аппаратом формальных - фактических параметров.

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

Рис. 2.6.  Открытие рабочей книги, содержащей ссылки

Поскольку в данной рабочей книге есть ссылки на другие рабочие книги, то при открытии документа появляется сообщение о том, что, возможно, следует обновить документ, поскольку после его закрытия могли измениться документы, на которые он ссылается. На листе рабочей книги нашего примера расположена командная кнопка с надписью "ChooseBook". Эту кнопку пользователь должен нажать в тот момент, когда он стоит на распутье, и должен выбрать, с какой следующей книгой он хочет работать. Вот текст обработчика события "Click":

Private Sub CommandButton5_Click()

ChooseBook

End Sub

Public Sub ChooseBook()

'Выбор книги, с которой будет работать пользователь

Const PathDir As String = "e:\O2000\CD2000\Ch2\"

Dim Answer As Variant

Dim CurrentBook As String

Dim Book As Workbook

Dim Found As Boolean

Answer = InputBox(prompt:= _

"Выберите книгу, с которой будете работать (1/2/3)", Default:=1)

Select Case Answer

Case 1

CurrentBook = "BookOne.xls"

Case 2

CurrentBook = "BookTwo.xls"

Case 3

CurrentBook = "BookThree.xls"

Case Else

CurrentBook = "I don't know such book"

End Select

MsgBox ("Your choose is " & CurrentBook)

'Проверяем есть ли уже книга в коллекции

Found = False

For Each Book In Workbooks

If Book.Name = CurrentBook Then

Found = True

Exit For

End If

Next Book

If Found Then

'Активизируем выбранную книгу

Workbooks(CurrentBook).Activate

ElseIf CurrentBook = "I don't know such book" Then

MsgBox ("I don't know such book")

Else 'Добавляем книгу в коллекцию

Workbooks.Open PathDir & CurrentBook

Workbooks(CurrentBook).Activate

End If

End Sub

Пример 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 хранят свои названия, их и печатает наша процедура, вызываемая в проекте одной из этих книг.