|
вызывается подпрограмма, которая строит сводную таблицу.
ШАГ 3. Процедура SetUpHeadings использует объект Selection активной в данный
момент электронной таблицы, чтобы присвоить названия столбцов. Обратите
внимание, что метод Offset применяется для смещения вправо при заполнении
заголовков для второго и третьего столбцов, а также для выделения ячейки в
первом столбце первого ряда, располагающегося под заголовками.
Довольно обычным контрдоводом против программирования “сверху-вниз” является
суждение о том, что это мешает поэтапному проведению отладки — приложение можно
запустить на выполнение только после написания всего кода. Однако такой тезис
неверен: на самом деле поэтапная отладка легко реализуется с помощью
использования разнообразных “заглушек” (пустых или реализованных в упрощенном
варианте процедур).
Например, на данном этапе можно просто превратить в комментарии все операторы в
CreateVBProjCrossRef, оставив только обращение к SetUpHeadings. Запустите
программу на выполнение и убедитесь, что заголовки формируются правильно.
Обратите внимание на то, что пока они записываются в текущую позицию курсора.
Может быть, вы хотите сделать очистку таблицы и установку курсора в ее начало
по умолчанию? Пару необходимых для этого строк вы можете написать
самостоятельно в любой момент — сейчас или позднее.
Напомним также, что при работе в среде VBA при запуске приложения на выполнение
(Run/F5) управление передается компоненте (в данном случае — процедуре),
которая в данный момент находится в активном окне среды. Так что перед тем, как
нажать F5, установите текстовый курсор в окне кода на процедуру
CreateVBProjCrossRef.
ШАГ 4. Пишем процедуру LoadProjectFile, ключевую для всего проекта —
формирование исходной таблицы компонентов. Она работает в цикле, обращаясь к
стандартному диалоговому окну для определения имени существующего файла (рис.
2). С этой целью используется метод GetOpenFilename объекта Application и
расширения .MAK и .VBP для идентификации файлов проектов. Если пользователь
вместо выбора файла (кнопка Open) нажимает Cancel, формирование таблицы
заканчивается и функция возвращает в вызывающую программу значение True или
False в зависимости от того, был ли выбран хотя бы один проект или нет.
Тип выбранного файла (MAK или VBP) можно определить по расширению его имени. Но
мы здесь делаем по-другому: файл проекта открывается и проверяется наличие
знака равенства в первой строке (см. листинги 1 и 2). Обратите внимание, что в
случае MAK-файла необходимо установить указатель чтения/записи внутри файла в
его начало, чтобы учесть первую строку при формировании списка компонентов.
Рис. 2
После этого вызывается соответствующая процедура — LoadMAK или LoadVBP, чтобы
загрузить информацию из файла проекта в коллекцию Files, а затем поместить эту
информацию из коллекции Files в электронную таблицу. Обратите внимание, что
первый цикл For...Next просматривает коллекцию Files, а второй цикл For...Next
— массив, содержащий детальную информацию для каждого файла.
ШАГ 5. Пишем код процедур LoadMAK, LoadVBP и FilesAdd. Разница между
процедурами LoadMAK и LoadVBP заключается в том, как идентифицируется тип
компонента в строках файла описания проекта. В первом случае это делается с
помощью расширения имени файла, во втором – с помощью ключевого слова в начале
строки. Обе процедуры используют вспомогательную подпрограмму FilesAdd, в
которой производится выделение короткого имени файла и записи его описания в
коллекцию Files.
ВАЖНОЕ ЗАМЕЧАНИЕ. Для выполнения некоторый операций при обработке строк
символьных файлов MAK и VBP мы использовали созданные ранее процедуры
ParseString и FileNameTest, которые применялись в различных наших
VB-приложениях. Они записаны в модулях PARSESUB.BAS и INSTRREV.BAS,
соответственно. Загрузить их в создаваемое нами приложение в среде Excel/VBA
можно с помощью команды File|Import File, но при этом следует иметь в виду
очень важное обстоятельство.
BAS-модуль, загруженный таким образом в Office/VBA (это относится и к Word, и к
Excel), автоматически теряет логическую связь с соответствующим BAS-файлом,
хранимым на диске, и становится сугубо внутренним компонентом данного
приложения. Это одно из существенных отличий логики использования BAS-модулей в
обычном VB и VBA. Во втором случае (с которым мы имеем дело сейчас, работая в
Excel 97) изменения, сделанные в BAS-файле, никак не влияют на состояние
загруженного BAS-модуля и наоборот.
Соответственно, если мы хотим в своих будущих приложениях использовать какие-то
модули, сформированные в VBA, то мы должны записать их на диск с помощью
специальной команды File|Export. Таким образом, замена названий команд
чтения/записи модулей Add/Save на Import/Export на самом деле отражает отличия
в механизме работы с модулями.
После загрузки модулей PARSESUB.BAS и INSTRREV.BAS мы увидим, что в Excel/VBA
они получили тривиальные имена Module1 и Module2. Такая замена имен
представляется правильным шагом, так как — повторим еще раз — это уже другие
компоненты, не связанные с родительским файлами. В этом плане вариант,
реализованный в Word 97, когда имени внутреннего модуля присваивается имя
исходного файла (строго говоря даже не имя файла, а название в первой строке
файла Attribute VB_Name — если она имеется), представляется не очень правильным,
так как создает иллюзию однозначного соответствия между этими двумя
компонентами.
ШАГ 6. Учитывая все это, после загрузки модулей PARSESUB.BAS и INSTRREV.BAS
|
|