- •Создание динамических структур данных
- •Встроенный динамический класс Collection
- •Создание собственных динамических классов
- •Обертывание коллекции vba
- •Несколько слов об api, Win32, dll
- •Вызов функций и оператор Declare
- •Две кодировки ansi и Unicode
- •Два языка: c и vb. Различия при вызове функций
- •Соответствие между простыми типами данных
- •Структуры языка c и тип, определенный пользователем, в языке vba
- •Об описателях языка c и объектах Windows
- •Void функции языка c
- •Вызов аргументов по ссылке ByRef и по значению ByVal
- •Строковые аргументы при вызове функций Win32 api
- •Примеры работы с Win32 api функциями
- •Работа с окнами
- •Характеристики окружения
- •Вызов функций Win32 api, работающих в Unicode кодировке
- •Обработка ошибок, возникающих при вызове функций Win32 api
- •Функции api и вызов Callback функций
- •Функции высших порядков и конструкция AddressOf
- •Функции перечисления Win32 api
- •Функция EnumWindows
- •Еще один пример работы с функцией EnumWindows
- •Функции Win32 api для работы с таймером
- •Функция SetTimer
- •Функция обратного вызова TimerProc
- •Функция KillTimer
- •Пример создания, работы и удаления таймера
- •Классы как обертка вызовов функций Win32 api
- •Построение класса "ВашТаймер"
- •Использование класса ВашТаймер
- •Операторы
- •Операторы и строки
- •Оператор комментария
- •Присваивание
- •Оператор Let
- •Оператор lSet
- •Оператор rSet
- •Оператор Set
- •Управляющие операторы
- •Условный оператор If Then Else End If
- •Оператор выбора Select Case
- •Цикл For Next
- •Цикл Do...Loop
- •Цикл While...Wend
- •Цикл For Each...Next
- •Работа с каталогами, папками и файлами
- •Изменение текущего диска: оператор ChDrive
- •Изменение текущего каталога (папки): оператор ChDir
- •Создание каталога (папки): оператор MkDir
- •Переименование каталогов (папок) и файлов: оператор Name
- •Удаление каталога (папки): оператор RmDir
- •Установка атрибутов файла: оператор SetAttr
- •Копирование файлов: оператор FileCopy
- •Удаление файлов: оператор Kill
- •Прочие операторы
- •Операции с одним объектом. Оператор With
- •Операции
- •Работа с числовыми данными
- •Математические функции
- •Работа со строками
- •Сравнение строк
- •Сравнение с образцом
- •Основные операции над строками
- •Новые функции для работы со строками
- •Функция InStrRev - поиск последнего вхождения подстроки
- •Функция Replace - замена всех вхождений подстроки
- •Удаление подстроки
- •Разбор строки. Функции Split, Join и Filter
- •Преобразование строки в массив. Функция Split
- •Сборка элементов массива в строку. Функция Join
- •Фильтрация элементов массива. Функция Filter
- •Несколько модификаций встроенных функций
- •Замена, основанная на шаблоне. Функция WildReplace
- •Замена разных символов строки. Функция CharSetReplace
- •Фильтрация, основанная на шаблоне. Функция WildFilter
- •Разбор строки, допускающей разные разделители ее элементов. Функция WildSplit
- •Работа с датами и временем
- •Присваивание значений
- •Встроенные функции для работы с датами
- •Определение текущей даты или времени.
- •Вычисления над датами
- •Функция Timer и хронометраж вычислений
- •Некоторые встроенные функции
- •Функции проверки типов данных
- •Преобразование типов данных
- •Форматирование данных. Функции группы Format
- •Функция Format.
- •Другие функции форматирования
- •Описание и создание процедур
- •Классификация процедур
- •Синтаксис процедур и функций
- •Функции с побочным эффектом
- •Создание процедуры
- •Создание процедур обработки событий
- •Вызовы процедур и функций Вызовы процедур Sub
- •Вызовы функций
- •Использование именованных аргументов
- •Аргументы, являющиеся массивами
- •Конструкция ParamArray
- •Задача о медиане
- •Пользовательские функции, принимающие сложный объект Range
- •Рекурсивные процедуры
- •Деревья поиска
- •Класс TreeNode
- •Класс BinTree
- •Работа со словарем
- •Отладка
- •Написание надежных программ
- •Искусство отладки
- •Средства отладки
- •Панель отладки и команды меню
- •Окна наблюдения
- •Окно локальных переменных - Locals
- •Окно проверки - Immediate
- •Окно контрольных выражений - Watch
Замена разных символов строки. Функция CharSetReplace
Другим важным случаем, допускающим простую реализацию, является случай, когда замене подлежат вхождения отдельного символа, а не целой подстроки, как в общем случае. Наша функция производит замену разных символов из заданного множества на один и тот же символ. Алгоритм основан на обычном линейном просмотре и посимвольном сравнении. Сама замена производится путем выделения и конкатенации.
Эта функция понадобилась нам для реализации нового варианта функции расщепления строки, хотя она полезна и сама по себе. Приведем ее текст:
Public Function CharSetReplace(ByVal expr As String, ByVal find As String, _
ByVal Rep As String)
'Эта функция применима в том частном случае, когда в строке - источнике Expr
'требуется произвести замену символов, входящих в множество, заданное аргументом find
'на символ (последовательность символов), заданных аргументом rep
Dim Source As String
Dim i As Long, Sym As String
Dim N As Long
N = Len(expr)
Source = expr
For i = 1 To N
Sym = VBA.Mid$(Source, i, 1)
If InStr(1, find, Sym) Then
Source = VBA.Left$(Source, i - 1) & Rep & VBA.Mid$(Source, i + 1)
End If
Next i
CharSetReplace = Source
End Function
Приведем теперь тестовую процедуру, организующую вызов функции CharSetReplace:
Public Sub testCharSetReplace()
Dim Text As String
Text = "test123"
Text = CharSetReplace(Text, "1234567890", "*")
Debug.Print Text
Text = "Шла кошка по крыше"
Text = CharSetReplace(Text, "аоеиуыяюэ", "*")
Debug.Print Text
End Sub
В результате ее работы в окне отладки появляются следующие данные:
Шл* к*шк* п* кр*ш*
Agent***, Agent***, Агент Майор Пронин, Agent***
Фильтрация, основанная на шаблоне. Функция WildFilter
Во многих ситуациях есть необходимость производить фильтрацию элементов массива, основываясь на шаблоне, которому должны удовлетворять фильтруемые элементы. Здесь есть полная аналогия с тем, что есть потребность производить замену на основе шаблона, а не точного образца. Поэтому естественно наше желание расширить стандартные возможности функции Filter, тем более, что реализуется эта возможность достаточно просто. Рассмотрим реализацию нашей функции:
Public Function WildFilter(sourcearray() As String, ByVal match As String, _
Optional ByVal include As Boolean = True) As Variant
'Эта функция фильтрует элементы исходного массива, проверяя их на соответствие
шаблону match
'В отличие от стандартной функции Filter элементы проверяются на точное
соответствие
'но шаблон match может включать специальные символы шаблона.
'Возвращается массив отобранных элементов. Если булев параметр include
равен True
'то отбираются элементы, совпадающие с шаблоном, в противном случае - не
совпадающие.
Dim Sel() As String
Dim i As Long, j As Long
j = 1
If include Then
For i = LBound(sourcearray) To UBound(sourcearray)
If sourcearray(i) Like match Then
ReDim Preserve Sel(1 To j)
Sel(j) = sourcearray(i): j = j + 1
End If
Next i
Else
For i = LBound(sourcearray) To UBound(sourcearray)
If Not (sourcearray(i) Like match) Then
Sel(j) = sourcearray(i): j = j + 1
End If
Next i
End If
WildFilter = Sel
End Function
Пример 8.5. (html, txt)
Параметры этой функции сохраняют смысл стандартной функции Filter. Единственное отличие состоит в том, что теперь аргумент match задает настоящий шаблон, допускающий специальные символы. Чтобы быть справедливым, заметим, что теперь речь идет о точном соответствии шаблону, в то время, как в стандартной функции речь идет о вхождении шаблона в элемент. Так что обе функции имеют свои сферы применения. Реализация достаточно очевидна и основана на прямом использовании операции Like. Приведем тестовый пример, в котором вызывается наша функция:
Public Sub testWildFilter()
Dim Txt As String, resTxt As String
Dim Artxt() As String, ResAr() As String
Txt = "123, 5, 117, 7, 189"
Artxt = Split(Txt, ", ")
ResAr = WildFilter(Artxt, "1##")
resTxt = Join(ResAr, ", ")
Debug.Print resTxt
ResAr = WildFilter(Artxt, "[3-57-9]")
resTxt = Join(ResAr, ", ")
Debug.Print resTxt
End Sub
Приведем результаты ее работы:
123, 117, 189
5, 7