|
(команда File|Import File), которые преобразятся в компоненты Module1 и Module2
нашего проекта, мы выполним следующие операции. Скопируем текст процедуры
ParseString из Module1 в Module (выделив текст, а затем записав его в буфер
обмена и восстановив оттуда). Затем удалим Module1 (оставшиеся там процедуры
нам не понадобятся), а Module2 переименуем в Service (см. листинг 4).
Листинг 4. Текст модуля кода Service
Attribute VB_Name = “Service”
DefInt I-N
Sub FileNameTest(PathFile$, Path$, File$)
‘
‘ Вход: PathFile$ - полное имя файла
‘ Выход: Path$ - имя каталога
‘ File$ - имя файла
in1 = InstrReverse(PathFile$, “\”)
If in1 <= 0 Then
Path$ = “”: File$ = PathFile$
Else
Path$ = LEFT$(PathFile$, in1)
File$ = Mid$(PathFile$, in1 + 1)
End If
End Sub
Function InstrReverse(Text$, Key$)
‘
‘ поиск ПОСЛЕДНЕГО (а не первого, как в INSTR)
‘ контекста в строке, Text$ - исходная строка
‘ Key$ - разделитель в строке
in1 = InStr(Text$, Key$)
If in1 > 0 Then
Do While in1 < Len(Text$)
in2 = InStr(in1 + 1, Text$, Key$)
If in2 <= 0 Then Exit Do Else in1 = in2
Loop
End If
InstrReverse = in1
End Function
Function ParseString(s$, del$, n) As String
‘ синтаксический анализ строки на наличие разделителя,
‘ возвращает n-ое значение
Dim pos As Long, i As Integer, pos2 As Long
‘
ParseString = s$
pos = InStr(s$, del$)
If pos Then ‘ если есть del$
If n = 1 Then
ParseString = LEFT$(s$, pos - 1)
Else
For i = 1 To n - 1 ‘ подсчет элементов данных
pos2 = InStr(pos + 1, s$, del$)
If pos2 = 0 Then ‘ конец строки
If i = n - 1 Then
ParseString = Trim(Mid$(s$, pos + _
Len(del$)))
‘ длина разделителя
Else
ParseString = “”
‘ n-ый элемент данных не найден
End If
Exit Function
End If
ParseString = Trim(Mid$(s$, pos + Len(del$), _
pos2 - pos - Len(del$)))
pos = pos2
Next
End If
ElseIf n > 1 Then
ParseString = “” ‘ n-ый элемент данных не найден
End If
End Function
Эти замысловатые операции нужны для того, чтобы подчеркнуть отсутствие
физической связи между компонентами проекта Excel и исходными BAS-файлами.
Такой способ применения повторно используемого программного кода (копирование
процедур из модуля в модуль) мы категорически не рекомендуем при работе в
обычном VB, но при работе в VBA он вполне допустим, а порой (как в данном
случае) — даже полезен. Мы обсудим эти проблемы, связанные со спецификой работы
с повторно используемыми процедурами в VB и VBA, в последующих статьях. А пока
продолжим создание нашего приложения.
ШАГ 7. Проверим работоспособность нашего приложения на этом этапе. В головной
процедуре CreateVBProjCrossRef оставим знак комментария только у обращения к
CreatPivotTable. Запустите программу на выполнение и убедитесь, что по мере
выбора имен файлов VB-проектов в среде Excel формируется исходная электронная
|
|