Rambler's Top100
Российский фонд помощи
Навигация
Главная
MS ACCESS
VB
ASP
PHP
Наши друзья
Поиск
Форум
Лента новостей
Новый сайт

Online
Рассылки Subscribe.Ru
Работа с MS Access
Подписаться письмом
Реклама на сайте
 
Главная arrow MS ACCESS arrow Урок 3. Работа со строками.
Урок 3. Работа со строками. Печать E-mail
Автор NSA   
15.10.2001 г.
Оглавление
Урок 3. Работа со строками.
Страница 2
В этом уроке просто расскажу о том, что в Access'e (VBA) можно делать со строками.
Урок 3. Работа со строками.

В этом уроке просто расскажу о том, что в Access'e (VBA) можно делать со строками.

Specially for Сергей Чаплыгин :-)
---------------------------------------------------------
 

Инструкция Option Compare.
 
 

Применяется на уровне модуля для задания используемого по умолчанию способа сравнения строковых данных.
 

Option Compare {Binary | Text | Database}

Инструкция Option Compare при ее использовании должна находиться в модуле перед любой процедурой.

Инструкция Option Compare указывает способ сравнения строк (Binary, Text или Database) для модуля. Если модуль не содержит инструкцию Option Compare, по умолчанию используется способ сравнения Binary.

Инструкция Option Compare Binary задает сравнение строк на основе порядка сортировки, определяемого внутренним двоичным представлением символов. В Microsoft Windows порядок сортировки определяется кодовой страницей символов. В следующем примере представлен типичный результат двоичного порядка сортировки:

A < B < E < Z < a < b < e < z < Б < Л < Ш < б < л < ш

Инструкция Option Compare Text задает сравнение строк без учета регистра символов на основе системной национальной настройки. Тем же символам, что и выше, при сортировке с инструкцией Option Compare Text соответствует следующий порядок:

(A=a) < (B=b) < (E=e) < (Z=z) < (Б=б) < (Л=л) < (Ш=ш)

Инструкция Option Compare Database может использоваться только в Microsoft Access. При этом задает сравнение строк на основе порядка сортировки, определяемого национальной настройкой базы данных, в которой производится сравнение строк.

В Microsoft Access все модули по умолчанию содержат в разделе описаний инструкцию Option Compare Database. Данная инструкция указывает, что в этом модуле используется метод сравнения строк, определенный для всей базы данных. Для изменения используемого в базе данных метода сравнения строк выберите в меню Сервис команду Параметры, выберите вкладку Общие и выберите нужное значение в раскрывающемся списке Порядок сортировки базы. По умолчанию задается "Обычный порядок", указывающий сортировку по английскому алфавиту без учета регистра.

Изменение параметра, выбираемого в поле со списком Порядок сортировки базы данных, не приводит к изменению способа сравнения строк в текущей базе данных. Затрагиваются толко базы данных, создаваемые после изменения этого параметра. Для того чтобы использовать в отдельном модуле метод сравнения строк, отличный от заданного для базы данных, следует заменить инструкцию Option Compare Database на Option Compare Binary или Option Compare Text. Инструкция Option Compare Binary задает сравнение строк с помощью значений кодов ASCII, соответствующих символам, в результате чего сравнение и сортировка будут выполняться с учетом регистра. Инструкция Option Compare Text задает выполнение операций без учета регистра.

Примечание. Если используется свойство Bookmark объекта Recordset (набор записей), необходимо включить в раздел описаний модуля инструкцию Option Compare Binary. Значение свойства Bookmark задается и возвращается в виде массива Variant, содержащего данные типа Byte. Если задан метод сравнения строк без учета регистра, то использование свойства Bookmark может привести к переходу на неверную запись.
 

--------------------------------------------------------------------------------

Функция Len.

Возвращает значение типа Long, содержащее число символов в строке или число байт, необходимое для размещения переменной.

Len(строка | имяПеременной)

строка - любое допустимое строковое выражение. Если строка имеет значение Null, возвращается значение Null.

имяПеременной - любое допустимое имя переменной. Если имяПеременной имеет значение Null, возвращается значение Null. Если имяПеременной является значением типа Variant, функция Len обрабатывает его так же, как и значение типа String, и всегда возвращает число содержащихся в нем символов.

Из двух возможных аргументов должен быть указан один (и только один). Для определяемых пользователем типов Len возвращает размер, который требуется для записи переменной в файл. Эквивалентной функцией обработки строк по байтам является функция LenB, которая возвращает число байт, используемое для представления указанной строки, а не число символов в строке. Для определяемых пользователем типов функция LenB возвращает размер, занимаемый в памяти, включая заполнение промежутков между элементами. Функция Len не всегда может корректно определить число байт, необходимое для размещения строк переменной длины в определяемых пользователем типах данных.

Пример:

Если strText = "Microsoft Access", то Len(strText) = 16
Если strText = Null, то Len(strText) = Null
 

--------------------------------------------------------------------------------

Функция InStr.

Возвращает значение типа Variant (Long), указывающее позицию первого вхождения одной строки внутри другой строки.

InStr([start, ]string1, string2[, compare])

start - Необязательный. Числовое выражение, задающее позицию, с которой начинается каждый поиск. Если этот аргумент опущен, поиск начинается с первого символа строки. Если start имеет значение Null, возникает ошибка. Указание аргумента start является обязательным, если указан аргумент compare.
string1 - Обязательный. Строковое выражение, в котором выполняется поиск.
string2 - Обязательный. Искомое строковое выражение.
compare - Необязательный. Указывает способ сравнения строк. Аргумент compare может быть опущен или иметь значение 0, 1 или 2. Чтобы выполнить двоичное сравнение, следует указать 0 (это значение используется по умолчанию). Чтобы выполнить посимвольное сравнение без учета регистра, следует указать 1. Только в Microsoft Access допускается использование значения 2 для выполнения сравнения на основании сведений, содержащихся в базе данных. Если аргумент compare имеет значение Null, возникает ошибка. Если аргумент compare опущен, способ сравнения строк определяется значением параметра инструкции Option Compare.

Если string1 является пустой строкой, то значение функции InStr = 0
Если string1 имеет значение Null, то значение функции InStr = Пустое значение
Если string2 является пустой строкой, то значение функции InStr = start
Если string2 имеет значение Null, то значение функции InStr = Пустое значение
Если string2 не найдена, то значение функции InStr = 0
Если string2 найдена в string1, то значение функции InStr = Позиция обнаруженной подстроки
Если start > string2, то значение функции InStr = 0

Эквивалентной функцией обработки строк по байтам является функция InStrB, которая возвращает позицию байта (а не символа), соответствующую положению одной строки внутри другой строки.

Пример:

Если string1 = "Иванов Иван Иванович", а string2 = "Иван", то:
InStr(1, string1, string2) = 1
InStr(2, string1, string2) = 8
InStr(9, string1, string2) = 13
InStr(14, string1, string2) = 0
 

--------------------------------------------------------------------------------

Используя функции Len и InStr напишем функцию нахождения количества вхождений одной строки в другую.
Функции и инструкции работы со строками.

Для работы со строками в VBA существуют следующие функции и инструкции:
Функции: Len, InStr, StrComp, Left, Right, Mid, LTrim, RTrim, Trim, Space, String, Asc, Chr, UCase, LCase.
Инструкции: Option Compare, Mid.
 

Рассмотрим их поподробнее.
 

Function StrUtils_GetCountSubStrings(ByVal _ 
strText1 As String, ByVal strText2 As String, _ 
Optional ByVal lngStartPosition As Long = 1) As Long 
'© NSA Programmer, 2001. http://www.msaccess.ru  
' ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'-------------------------------------------------------- 
' Функция считает количество вхождения строки strText2 
' в сторку strText1 начиная с позиции lngStartPosition 
'-------------------------------------------------------- 
'Текущая позиция подстроки strText2 в строке strText1 
Dim lngPosition As Long  

'Счетчик вхождений подстроки strText2 в 
'строке strText1 
Dim lngCount As Long  

'"Стартовое" значение текущей позиции: 
' стартовая позиция минус длинна строки strText2 
lngPosition = lngStartPosition - Len(strText2) 

'"Стартовое" счетчика вхождений: -1 
lngCount = -1 

'Такие "экотические" начальные значения текущей позиции  
'и счетчика вхождений нужны для того, чтобы после  
'первого прохода цикла они были правильными вне  
'звисимость от наличия подстроки strText2 в строке  
'strText1. При этом отпадает необходимость  
'дополнительных проверок, код функции становиться более  
'оптимальным. 

'Цикл 
Do 
'Вычисляем текущую позицию вхождения подстроки  
'strText2 в строку strText1, начиная с "текущей  
'позиции + длинна строки strText2". 
lngPosition = InStr(lngPosition + Len(strText2), _ 
strText1, strText2) 
'Инкримируем счетчик вхождений 
   lngCount = lngCount + 1 
'Заканчиваем цикл если текущая позиция = 0 
Loop Until lngPosition = 0 
'Присваиваем функции значение счетчика вхождений 
StrUtils_GetCountSubStrings = lngCount 

'Примеры вызова: 
' ? StrUtils_GetCountSubStrings("Иванов Иван Иванович", _ 
' "Иван") 
' ? StrUtils_GetCountSubStrings("Иванов Иван Иванович", _ 
' "Иван", 2) 
End Function 


 

Функция StrComp.
 
 

Возвращает значение типа Variant (Integer), представляющее результат сравнения строк.

StrComp(string1, string2[, compare])

string1 - Обязательный. Любое допустимое строковое выражение.

string2 - Обязательный. Любое допустимое строковое выражение.

compare - Необязательный. Указывает способ сравнения строк. Аргумент compare может быть опущен или иметь значение 0, 1 или 2. Чтобы выполнить двоичное сравнение, следует указать 0 (это значение используется по умолчанию). Чтобы выполнить посимвольное сравнение без учета регистра, следует указать 1. Только в Microsoft Access допускается использование значения 2 для выполнения сравнения на основании сведений, содержащихся в базе данных. Если аргумент compare имеет значение Null, возникает ошибка. Если аргумент compare опущен, способ сравнения строк определяется значением параметра инструкции Option Compare.

Если string1 меньше чем string2 , то значение функции StrComp = -1
Если string1 равняется string2, то значение функции StrComp = 0
Если string1 больше чем string2, то значение функции StrComp = 1
Если string1 или string2 имеет значение Null, то значение функции StrComp = Null
 

--------------------------------------------------------------------------------

Функция Left.

Возвращает значение типа Variant (String), содержащее указанное число первых символов строки.

Left(string, length)

string - Обязательный. Строковое выражение, из которого извлекаются символы. Если string имеет значение Null, возвращается значение Null.
length - Обязательный. Значение типа Variant (Long) . Числовое выражение, указывающее число возвращаемых символов. Если 0, возвращается пустая строка (""). Если значение length больше либо равняется числу символов в строке string, возвращается вся строка.

Для определения числа символов в строке string следует использовать функцию Len. Эквивалентной функцией обработки строк по байтам является функция LeftB. В этом случае length указывает число байт (а не символов), которые следует вернуть.

Пример:

Если string = "Иванов", то Left(string, 3) = "Ива"
 

--------------------------------------------------------------------------------

Функция Right.

Возвращает значение типа Variant (String), содержащее указанное число последних символов строки.

Right(string, length)

string - Обязательный. Строковое выражение, из которого извлекаются символы. Если string имеет значение Null, возвращается значение Null.
length - Обязательный. Значение типа Variant (Long) . Числовое выражение, указывающее число возвращаемых символов. Если 0, возвращается пустая строка (""). Если превышает число символов в строке string, возвращается вся строка.

Для определения числа символов в строке string следует использовать функцию Len. Эквивалентной функцией обработки строк по байтам является функция RightB. В этом случае аргумент length указывает число байт (а не символов), которые следует вернуть.

Пример:

Если string = "Иванов", то Right(string, 3) = "нов"
 

--------------------------------------------------------------------------------

Функция Mid.

Возвращает значение типа Variant (String), содержащее указанное число символов строки.

Mid(string, start[, length])

string - Обязательный. Строковое выражение, из которого извлекаются символы. Если string имеет значение Null, возвращается значение Null.
start - Обязательный. Значение типа Long. Позиция символа в строке string, с которого начинается нужная подстрока. Если start больше числа символов в строке string, функция Mid возвращает пустую строку ("").
length - Необязательный. Значение типа Variant (Long). Число возвращаемых символов. Если этот аргумент опущен или превышает число символов, расположенных справа от позиции start, то возвращаются все символы от позиции start до конца строки.

Для определения числа символов в string следует использовать функцию Len. Эквивалентной функцией обработки строк по байтам является функция MidB. В этом случае аргументы указывают число байт (а не символов).

Пример:

Если string = "Иванов", то Mid(string, 3,2) = "но", а Mid(string, 3) = "нов"
 

--------------------------------------------------------------------------------

Инструкция Mid.

Заменяет указанное число символов в переменной типа Variant (String) символами из другой строки.

Mid(переменная, начало[, длина]) = строка

переменная - Обязательный. Имя строковой переменной, подлежащей изменению.
начало - Обязательный. Значение типа Variant (Long). Позиция символа в переменной, с которого начинается замена.
длина - Необязательный. Значение типа Variant (Long). Число символов, подлежащих замене. Если этот аргумент опущен, используется вся строка.
строка - Обязательный. Строковое выражение, предназначенное для замены части строки переменная.

Число замененных символов не может превышать число символов в переменной. Эквивалентной инструкцией обработки строк по байтам является инструкция MidB. В этом случае аргумент начало указывает в строке переменная позицию байта, с которого начинается замена, а длина - число байт, подлежащих замене.

Пример:

Если сначала переменная = "Иванов",
то после выполнения спрочки Mid(переменная, 3,2) = "ру"
переменная = "Иварув"
 

--------------------------------------------------------------------------------

Функции LTrim, Rtrim и Trim.

Возвращают значение типа Variant (String), содержащее копию строки, из которой удалены пробелы, находившиеся в начале строки (LTrim), в конце строки (RTrim) или в начале и конце строки (Trim).

LTrim(строка)
RTrim(строка)
Trim(строка)

Обязательный аргумент строка представляет любое допустимое строковое выражение. Если строка имеет значение Null, возвращается значение Null.
 

--------------------------------------------------------------------------------

Функция Space.

Возвращает значение типа Variant (String), содержащее указанное число пробелов.

Space(число)

Обязательный аргумент число указывает нужное число пробелов в строке. Функцию Space удобно использовать для форматирования и очистки данных в строках фиксированной длины.
 

--------------------------------------------------------------------------------

Функция String.

Возвращает значение типа Variant (String), содержащее повторяющуюся строку указанной длины.

String(number, character)

number - Обязательный. Значение типа Long. Длина возвращаемой строки. Если number имеет значение Null, возвращается значение Null.
character - Обязательный. Значение типа Variant. Код символа или строковое выражение, первый символ которого используется при создании возвращаемой строки. Если character имеет значение Null, возвращается значение Null.

Значения аргумента character, превышающие 255, преобразуются функцией String в допустимые коды символов по следующей формуле: character Mod 256
 

--------------------------------------------------------------------------------

Функция Asc.

Возвращает значение типа Integer, представляющее код символа для первого символа строки.

Asc(строка)

Обязательный аргумент строка является любым допустимым строковым выражением. Если строка не содержит символов, возникает ошибка выполнения.

Возвращаемые значения лежат в диапазоне 0 - 255 для однобайтовых наборов, и в диапазоне -32768 - 32767 для двухбайтовых наборов символов (DBCS). Для работы с байтами данных, содержащихся в строке, предназначена другая функция (AscB). Вместо кода первого символа AscB возвращает первый байт. Функция AscW возвращает код символа, соответствующий кодировке Unicode, за исключением платформ, в которых Unicode не поддерживается и поведение функции аналогично функции Asc.
 

Напишем функцию StrUtils_InStrAsWord, возвращающую позицию строки strText2 в строке strText1 как целого слова начиная с позиции lngStartPosition.
 

Function StrUtils_InStrAsWord(ByVal strText1 As String, ByVal strText2 As String, Optional ByVal lngStartPosition As Long = 1) As Long 
'© NSA Programmer, 2001. http://www.msaccess.ru ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'------------------------------------------------------------- 
' Функция возвращает позицию вхождения строки strText2 как целого слова 
' в сторку strText1 начиная с позиции lngStartPosition 
'------------------------------------------------------------- 
'Будем считать "непечатными" символы, ASCII-коды которых 
'лежат в следующих диапазонах: 0-47, 58-64, 91-96, 123-191 

Dim lngPosition As Long    'Текущая позиция подстроки strText2 
                            в строке strText1 
Dim lngCount As Long        'Счетчик вхождений подстроки strText2 
                            в строке strText1 
Dim lngASCII_First As Long 'ASCII-код символа, стоящего  
                            перед искомой строкой  
Dim lngASCII_Last As Long 'ASCII-код символа, стоящего  
                            после искомой строки  
Dim blIsWord As Boolean    'Признак того, что строка strText2 входит в 
                            строку strText1 как слово  
'Добавляем по одному пробелу перед и после строки strText1. Делаем это для того, чтобы в процессе работы функции не возникала ошибка, когда бужем считывать символы перед и после найденного вхождения 
strText1 = " " & strText1 & " " 
'Увеличиваем стартовую позицию на еденицу  
(т.к. добавили перед строкой пробел) 
lngStartPosition = lngStartPosition + 1 
'"Стартовое" значение текущей позиции: стартовая позиция минус длинна строки strText2 
lngPosition = lngStartPosition - Len(strText2) 
'"Стартовое" значение счетчика вхождений: 0 
lngCount = 0 
Do 'Цикл 
'Вычисляем текущую позицию вхождения подстроки strText2 в строку 
     strText1 начиная с "текущей позиции + длинна строки strText2". 
   lngPosition = InStr(lngPosition + Len(strText2), strText1, strText2) 
'Если "текущей позиции" <> 0 - т.е. strText2 входит  
     в строку strText1... 
    If lngPosition <> 0 Then 
'Считываем ASCII-коды символов, находящихся  
         перед и после найденной строки  
     lngASCII_First = Asc(Mid(strText1, lngPosition - 1, 1)) 
     lngASCII_Last = Asc(Mid(strText1, lngPosition + Len(strText2), 1)) 
     blIsWord = True 'Признак = TRUE 
'Анализируем код символа перед вхождением строки strText2 
      Select Case lngASCII_First 
'Если код принадлежит диатазонам "непечатных" символов... 
          Case 0 To 47, 58 To 64, 91 To 96, 123 To 191 
'Ничего не делаем 
'Иначе... 
          Case Else 
'Признак = FALSE 
             blIsWord = False 
      End Select 
'Если Признак = TRUE... 
      If blIsWord = True Then 
'Анализируем код символа после вхождением строки strText2 
          Select Case lngASCII_Last 
'Если код принадлежит диатазонам "непечатных" символов... 
              Case 0 To 47, 58 To 64, 91 To 96, 123 To 191 
'Ничего не делаем 
'Иначе... 
              Case Else 
'Признак = FALSE 
                 blIsWord = False 
          End Select 
      End If 
'Если Признак = TRUE ... 
      If blIsWord = True Then 
'Уменьшаем на еденицу текущую позицию  
          (т.к. в начало строчки был добавлен пробел) 
         lngPosition = lngPosition - 1 
'Выходим из цикла 
         Exit Do 
      End If 
    End If 
Loop Until lngPosition = 0 'Заканчиваем цикл если текущая позиция = 0 
'Присваиваем функции значение текущей позиции 
StrUtils_InStrAsWord = lngPosition 

'Примеры вызова: 
' ? StrUtils_InStrAsWord("Иванов Иван Иванович", "Иван") 
' ? StrUtils_InStrAsWord("Иванов Иван Иванович", "Иван", 2) 

End Function 


 

Модифицируем функцию StrUtils_InStrAsWord в функцию StrUtils_GetCountSubStringsAsWord, возвращающую количество вхождений строки strText2 в строку strText1 как целого слова начиная с позиции lngStartPosition.

Function StrUtils_GetCountSubStringsAsWord(ByVal strText1 As String, ByVal strText2 As String, Optional ByVal lngStartPosition As Long = 1) As Long 
'© NSA Programmer, 2001. http://www.msaccess.ru ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'------------------------------------------------------------- 
' Функция считает количество вхождения строки strText2 как целого слова 
' в сторку strText1 начиная с позиции lngStartPosition 
'------------------------------------------------------------- 

'Будем считать "непечатными" символы, ASCII-коды которых 
'лежат в следующих диапазонах: 0-47, 58-64, 91-96, 123-191 

Dim lngPosition As Long    'Текущая позиция подстроки strText2 
                            в строке strText1 
Dim lngCount As Long        'Счетчик вхождений подстроки strText2 
                            в строке strText1 
Dim lngASCII_First As Long 'ASCII-код символа, стоящего  
                            перед искомой строкой  
Dim lngASCII_Last As Long 'ASCII-код символа, стоящего  
                            после искомой строки  
Dim blIsWord As Boolean    'Признак того, что строка strText2 входит в 
                            строку strText1 как слово  
'Добавляем по одному пробелу перед и после строки strText1. Делаем это для того, чтобы в процессе работы функции не возникала ошибка, когда бужем считывать символы перед и после найденного вхождения 
strText1 = " " & strText1 & " " 
'Увеличиваем стартовую позицию на еденицу  
(т.к. добавили перед строкой пробел) 
lngStartPosition = lngStartPosition + 1 
'"Стартовое" значение текущей позиции: стартовая позиция минус длинна строки strText2 
lngPosition = lngStartPosition - Len(strText2) 
'"Стартовое" значение счетчика вхождений: 0 
lngCount = 0 
Do 'Цикл 
'Вычисляем текущую позицию вхождения подстроки strText2 в строку 
     strText1 начиная с "текущей позиции + длинна строки strText2". 
   lngPosition = InStr(lngPosition + Len(strText2), strText1, strText2) 
'Если "текущей позиции" <> 0 - т.е. strText2 входит  
     в строку strText1... 
    If lngPosition <> 0 Then 
'Считываем ASCII-коды символов, находящихся  
         перед и после найденной строки  
     lngASCII_First = Asc(Mid(strText1, lngPosition - 1, 1)) 
     lngASCII_Last = Asc(Mid(strText1, lngPosition + Len(strText2), 1)) 
     blIsWord = True 'Признак = TRUE 
'Анализируем код символа перед вхождением строки strText2 
      Select Case lngASCII_First 
'Если код принадлежит диатазонам "непечатных" символов... 
          Case 0 To 47, 58 To 64, 91 To 96, 123 To 191 
'Ничего не делаем 
'Иначе... 
          Case Else 
'Признак = FALSE 
             blIsWord = False 
      End Select 
'Если Признак = TRUE... 
      If blIsWord = True Then 
'Анализируем код символа после вхождением строки strText2 
          Select Case lngASCII_Last 
'Если код принадлежит диатазонам "непечатных" символов... 
              Case 0 To 47, 58 To 64, 91 To 96, 123 To 191 
'Ничего не делаем 
'Иначе... 
              Case Else 
'Признак = FALSE 
                 blIsWord = False 
          End Select 
      End If 
'Если Признак = TRUE то инкримируем счетчик вхождений 
      If blIsWord = True Then lngCount = lngCount + 1 
    End If 
Loop Until lngPosition = 0 'Заканчиваем цикл если текущая позиция = 0 
'Присваиваем функции значение счетчика вхождений 
StrUtils_GetCountSubStringsAsWord = lngCount 

'Примеры вызова: 
' ? StrUtils_GetCountSubStringsAsWord("Иванов Иван Иванович", "Иван") 
' ? StrUtils_GetCountSubStringsAsWord("Иванов Иван Иванович", "Иван", 2)  

End Function 


 
 

Функция Chr.

Возвращает значение типа String, содержащее символ, соответствующий указанному коду символа.

Chr(кодСимвола)

Обязательный аргумент кодСимвола является значением типа Long, определяющим символ.

Коды 0-31 соответствуют стандартным управляющим символам ASCII. Например, Chr(10) возвращает символ перевода строки. Обычным диапазоном значений аргумента кодСимвола является интервал 0-255. Однако в системах DBCS допустимыми являются значения аргумента кодСимвола от -32768 до 65536. Эквивалентной функцией побайтовой обработки значений типа String является функция ChrB. Эта функция всегда возвращает один байт, а не символ, который может занимать один или два байта. Функция ChrW возвращает значение типа String, содержащее символ в основном формате Unicode, за исключением платформ, в которых Unicode не поддерживается и функция работает аналогично функции Chr.
 

--------------------------------------------------------------------------------

Функция UCase.

Возвращает значение типа Variant (String), содержащее строку, преобразованную к верхнему регистру.

UCase(строка)

Обязательный аргумент строка представляет любое допустимое строковое выражение. Если строка имеет значение Null, возвращается значение Null. К верхнему регистру преобразуются только строчные буквы; прописные буквы и прочие символы остаются неизменными.
 

--------------------------------------------------------------------------------

Функция LCase.

Возвращает значение типа String, представляющее строку, преобразованную к нижнему регистру.

LCase(строка)

Обязательный аргумент строка представляет любое допустимое строковое выражение. Если строка имеет значение Null, возвращается значение Null. К нижнему регистру преобразуются только прописные буквы; строчные буквы и прочие символы остаются неизмененными.
 

--------------------------------------------------------------------------------

Напишим функцию, возвращающую строку вида Фамилия И.О. из переданных Фамилии, Имени и Отчества.
 

Function StrUtils_FIO(Optional strLastName As String = "", Optional strFirstName As String = "", Optional strMiddleName As String = "") As String 
'© NSA Programmer, 2001. http://www.msaccess.ru ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'------------------------------------------------------------- 
' Функция возвращает строку в формате: Фамилия И.О. 
' strLastName - Фамилия 
' strFirstName - Имя 
' strMiddleName - Отчество 
'------------------------------------------------------------- 
Dim strText As String  
If strLastName <> "" Then 
   strText = UCase(Left(strLastName, 1)) & Mid(strLastName, 2) & " " 
End If 
If strFirstName <> "" Then 
   strText = strText & UCase(Left(strFirstName, 1)) & "." 
End If 
If strMiddleName <> "" Then 
   strText = strText & UCase(Left(strMiddleName, 1)) & "." 
End If 
StrUtils_FIO = strText 
'Примеры вызова: 
' ? StrUtils_FIO("Иванов Иван Иванович") 

End Function 


 

Напишем функцию, приводящую первый символ каждого слова переданной в нее строки к верхнему, а остальные символы - к нижнему регистру.
 

Function StrUtils_UCaseFirstChar(Optional strText As String = "") As String 
'© NSA Programmer, 2001. http://www.msaccess.ru ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'------------------------------------------------------------- 
' Функция возвращает переданную в нее строку strText, 
' приводя к верхнему регистру все первый буквы каждого слова этой строки,  
' и к нижнему регистру - все остальные 
'------------------------------------------------------------- 
'Будем считать "непечатными" символы, ASCII-коды которых 
'лежат в следующих диапазонах: 0-64, 91-96, 123-191 
Dim i As Long          'Счетчик цикла 
Dim strChar As String 'Символ перед текущим символом 
'Добавляем пробел перед строкой 
strText = " " & strText 
'Цикл по строке 
For i = 2 To Len(strText) 
'Считываем символ перед текущим 
   strChar = Mid(strText, i - 1, 1) 
'Анализируем его ASCII-код 
    Select Case Asc(strChar)  
'Если код принадлежит диапазонам "непечатных" символов... 
        Case 0 To 64, 91 To 96, 123 To 191 
'Текущий символ приводим к верхнему регистру 
           Mid(strText, i, 1) = UCase(Mid(strText, i, 1)) 
'Иначе... 
        Case Else 
'Текущий символ приводим к нижнему регистру 
           Mid(strText, i, 1) = LCase(Mid(strText, i, 1)) 
    End Select 
Next i 
StrUtils_UCaseFirstChar = strText 
'Примеры вызова: 
' ? StrUtils_UCaseFirstChar("иванов иван иванович") 

End Function 


 

Напишем функцию, которая будет возвращать lngNumber-е по счету слово в строке strText, в которой слова разделены символом (строкой) strDec. Если пареметр strDec пропущен - разделителем слов считается' любой "непечатный" символ.
 

Function StrUtils_GetWordDec(ByVal strText As String, Optional ByVal lngNumber As Long = 1, Optional strDec As Variant) As String 
'© NSA Programmer, 2001. http://www.msaccess.ru ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'------------------------------------------------------------- 
' Функция возвращает lngNumber-е по счету слово в строке strText, 
' в которой слова разделены символом (строкой) strDec. 
' Если пареметр strDec пропущен - разделителем слов считается 
' любой "непечатный" символ. 
'-------------------------------------------------------------- 
'Будем считать "непечатными" символы, ASCII-коды которых 
'лежат в следующих диапазонах: 0-47, 58-64, 91-96, 123-191 

Dim lngFirstPos As Long  
Dim lngNextPos As Long  
Dim lngStartPosition As Long 
Dim i As Long 
Dim strTempText As String 
Dim lngPosition As Long  
Dim lngCount As Long 
If IsMissing(strDec) Then 
   strText = strText & " " 
    For i = 1 To Len(strText) 
        Select Case Asc(Mid(strText, i, 1)) 
            Case 0 To 47, 58 To 64, 91 To 96, 123 To 191 
               lngCount = lngCount + 1 
                If lngCount = lngNumber Then 
                    StrUtils_GetWordDec = strTempText 
                    Exit For 
                End If 
               strTempText = "" 
            Case Else 
               strTempText = strTempText & Mid(strText, i, 1) 
        End Select 
    Next i 
Else 
   strText = " " & strDec & strText & strDec & " " 
   lngStartPosition = 2 
   lngPosition = lngStartPosition - Len(strDec) 
   lngCount = 0 
    Do 
       lngPosition = InStr(lngPosition + Len(strDec), strText, strDec)  
        If lngPosition <> 0 Then 
           lngCount = lngCount + 1 
            If lngNumber = lngCount Then 
               lngFirstPos = lngPosition 
            End If 
            If lngNumber + 1 = lngCount Then 
               lngNextPos = lngPosition 
               Exit Do 
            End If 
        End If 
    Loop Until lngPosition = 0 
    If lngFirstPos <> 0 And lngNextPos <> 0 Then 
       StrUtils_GetWordDec = Mid(strText, lngFirstPos + 1, lngNextPos - lngFirstPos - 1) 
    End If 
End If 
End Function 


 

Напишем функцию, возвращающую переданную в нее строку strText, "вырезая" из нее lngNumber-е по счету слово, в которой слова разделены символом (строкой) strDec. Если параметр strDec пропущен - разделителем слов считается любой "непечатный" символ.
 

Function StrUtils_CutWordDec(ByVal strText As String, Optional ByVal lngNumber As Long = 1, Optional strDec As Variant) As String 
'© NSA Programmer, 2001. http://www.msaccess.ru ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'------------------------------------------------------------- 
' Функция возвращает переданную в нее строку strText, "вырезая" 
' из нее lngNumber-е по счету слово, 
' в которой слова разделены символом (строкой) strDec. 
' Если пареметр strDec пропущен - разделителем слов считается 
' любой "непечатный" символ. 
'-------------------------------------------------------------- 
'Будем считать "непечатными" символы, ASCII-коды которых 
'лежат в следующих диапазонах: 0-47, 58-64, 91-96, 123-191 

Dim lngFirstPos As Long  
Dim lngNextPos As Long  
Dim lngStartPosition As Long 
Dim i As Long 
Dim strTempText As String 
Dim lngPosition As Long  
Dim lngCount As Long 
If IsMissing(strDec) Then 
   strText = " " & strText & " " 
    For i = 1 To Len(strText) 
        Select Case Asc(Mid(strText, i, 1)) 
            Case 0 To 47, 58 To 64, 91 To 96, 123 To 191 
               lngCount = lngCount + 1 
                If lngCount = lngNumber + 1 Then 
                    StrUtils_CutWordDec = Mid(strText, 2, i - Len(strTempText) - 2) & Mid(strText, i + 1) 
                    Exit For 
                End If 
               strTempText = "" 
            Case Else 
               strTempText = strTempText & Mid(strText, i, 1) 
        End Select 
    Next i 
Else 
   strText = " " & strDec & strText & strDec & " " 
   lngStartPosition = 2 
   lngPosition = lngStartPosition - Len(strDec) 
   lngCount = 0 
    Do 
       lngPosition = InStr(lngPosition + Len(strDec), strText, strDec)  
        If lngPosition <> 0 Then 
           lngCount = lngCount + 1 
            If lngNumber = lngCount Then 
               lngFirstPos = lngPosition 
            End If 
            If lngNumber + 1 = lngCount Then 
               lngNextPos = lngPosition 
               Exit Do 
            End If 
        End If 
    Loop Until lngPosition = 0 
    If lngFirstPos <> 0 And lngNextPos <> 0 Then 
        If Len(strText) - lngNextPos - Len(strDec) - 1 > 0 Then 
           StrUtils_CutWordDec = Mid(strText, Len(strDec) + 2, lngFirstPos - (Len(strDec) + 1)) & Mid(strText, lngNextPos + 1, Len(strText) - lngNextPos - Len(strDec) - 1) 
        Else 
           StrUtils_CutWordDec = Mid(strText, Len(strDec) + 2, lngFirstPos - (Len(strDec) + 1)) 
        End If 
    End If 
End If 
End Function 


 

Напишем функцию, которая возвращает переданную в нее строку, "печатая" ее справа налево
 

Function StrUtils_InvertString(ByVal strText As String) As String 
'© NSA Programmer, 2001. http://www.msaccess.ru ~ E-mail: Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script ~ ICQ: 7349882 
'------------------------------------------------------------- 
' Функция возвращает переданную в нее строку strText, 
' "печатая" ее справа налево 
'------------------------------------------------------------- 
Dim strTempText As String 
Dim i As Long 
For i = Len(strText) To 1 Step -1 
   strTempText = strTempText & Mid(strText, i, 1) 
Next i 
StrUtils_InvertString = strTempText 
End Function 

Просмотров: 87533

  Коментарии (14)
 1 Написал(а) Пётр, в 14:20 25.04.2008
Статья ОЧЕНЬ полезная! 
Спасибо!
 2 Написал(а) Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script , в 03:00 07.05.2008
Добрый день, 
очень интересная статья - главное полезная... такого нигде не найдешь - особенно для новичков... спасибо.. большое..  
хотел спросить - посоветуйте...  
у меня маленькая задачка - суть в следующем...  
есть база с 40 полями - индекс по одному ключевому полю.. формат полей в основном числовой целый - от 1 до 16... необходимо произвести для каждой записи подсчет количества тех или иных цифр... т.е. если допустим строка типа  
ID | field1 | field2| ... |field10| 
01 | 1 | 1 | ... |2 | 
 
то необходимо подсчитать сколько в записи 1 , сколько 2 , сколько 3, и т.д. 
 
Заранее благодарю за ответ, 
С уважением 
 
Акбар Ахметжанов
 3 Написал(а) Родион, в 22:40 19.05.2008
Akbar Akhmetzhanov, не за что. :-)))
 4 Написал(а) Денис, в 14:38 12.11.2008
Мне очень понравилась статься
 5 Написал(а) Марина, в 11:48 30.10.2009
Мне очень помогла данная информация. Спасибо!!!
 6 Написал(а) Оззи, в 21:18 19.11.2009
Бомба. Давно искал. Очень помогло. Спс.
 7 Написал(а) Оксана, в 16:34 13.02.2010
Интересная статья.Помогите,пожалуйста.У меня задача.Мне необходимо ставнить первую строку в Exel с последующими и проверить совпадают они или нет, задем вторую и т.д.
 8 Написал(а) Totoro, в 09:23 08.04.2010
Во-первых спасибо автору за познавательную статью. 
Во-вторых, отвечаю Оксане (если конечно ответ еще нужен). Вот макрос который ищет повторяющиеся значения в произвольном диапазоне ячеек. Надеюсь это то что нужно. Перед запуском макроса выделить мышкой нужный диапазон. Ячейки с повторами будут выделены красной рамкой. 
 
 
 
Sub Macros3() 
Dim cur_range As Range 
With ActiveSheet 
Set cur_range = Selection 
cur_range.Activate 
For i = 1 To cur_range.Rows.Count 
For j = 1 To cur_range.Columns.Count 
For x = 1 To cur_range.Rows.Count 
For y = 1 To cur_range.Columns.Count 
 
If i x Or j y Then 
If cur_range(x, y).Value = cur_range(i, j).Value Then 
With cur_range(i, j).Borders 
.LineStyle = xlContinuous 
.Weight = xlMedium 
.ColorIndex = 3 
End With 
End If 
End If 
 
Next y 
Next x 
Next j 
Next i 
End With 
End Sub
 9 Написал(а) Totoro, в 09:40 08.04.2010
P.S. В стороке "If i x Or j y Then" между символами i и x; и j и y должен стоять знак "не равно". Данный сайт почему то его не отобразил.
 10 Написал(а) Роман, в 22:48 16.04.2010
Огромное спасибо автору за статью! Очень помогли функции StrUtils_GetWordDec и strUtils_GetCountSubStringsAsWord!


 
Реклама на сайте
HiProg.com - Технологии программирования
Rambler's Top100 TopList