Описание некоторых встроенных функций VB

Ответы на вопросы, чаще всего задаваемые в форумах VBStreets. Для тех, кому лень искать.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Описание некоторых встроенных функций VB

Сообщение alibek » 20.05.2007 (Вс) 21:52

А знаете ли вы Visual Basic?

Копался я как-то в Object Browser, и вдруг увидел там такие штуки, которые в VB и не подозревал. И довольно долгое время использовал самописные функции для того, что оказывается в VB уже реализовано.
И тут я подумал, что может быть я не один такой?
Вот и решил опубликовать краткое описание встроенных функций VB и примеры их использования.


Модуль VBA.Conversion
Ну этот модуль скорее всего все знают, но формальности ради опишу и его.

Function CBool(Expression) As Boolean
Приводит выражение к типу данных Boolean. Null не обрабатывается и выдает ошибку, Empty интерпретируется как False. Числовые выражения интерпретируются как False для 0 и как True для всех остальных значений. Строковое выражение "true" (вне зависимости от регистра) интерпретируется как True, строковое выражение "false" (вне зависимости от регистра) интерпретируется как False. Все остальные строковые значения не обрабатываются и выдают ошибку, но если строковое выражение можно преобразовать к числу, то оно будет интерпретировано, как число (т.е. False для 0 и True для всех остальных значений). Или другими словами, если выражение может быть интерпретировано, как ненулевое значение, то используется True, иначе False. При преобразовании числовых выражений используются системные настройки (такие, как разделитель целой и дробной части и пр.).

Function CByte(Expression) As Byte
Приводит выражение к типу данных Byte. Null не обрабатывается и выдает ошибку, Empty интерпретируется как 0. Строковые выражения обрабатываются только если могут быть приведены к числовым выражениям, в противном случае они не будут обрабатываться и выдадут ошибку. Числовые выражения должны быть в диапазоне от 0 до 255, в противном случае возникнет ошибка. При преобразовании числовых выражений используются системные настройки (такие, как разделитель целой и дробной части и пр.).

Function CInt(Expression) As Integer
Function CLng(Expression) As Long
Function CSng(Expression) As Single
Function CDbl(Expression) As Double
Function CCur(Expression) As Currency
Приводит выражение к соответствующему типу данных. Null не обрабатывается и выдает ошибку, Empty интерпретируется как 0. Строковые выражения обрабатываются только если могут быть приведены к числовым выражениям, в противном случае они не будут обрабатываться и выдадут ошибку. При преобразовании числовых выражений используются системные настройки (такие, как разделитель целой и дробной части и пр.).

Function CDec(Expression)
Приводит выражение к типу Variant, субтипу Decimal. Этот тип данных существует только как подвид Variant, объявить переменную непосредственно как Decimal нельзя. Decimal это числовой формат для хранения десятичных чисел с плавающей запятой, масштабируется по степени 10 и поэтому ошибки округления в нем выражены значительно меньше чем в остальных форматах с плавающей запятой (Single и Double). Кроме того этот формат позволяет хранить до 28 значащих разрядов, что значительно больше, чем у Double (16 значащих разрядов). Минимальное значение 1e-28, максимальное 7.9e+28.
Правила привидения стандартные, Null не обрабатывается и выдает ошибку, Empty интерпретируется как 0. Строковые выражения обрабатываются только если могут быть приведены к числовым выражениям, в противном случае они не будут обрабатываться и выдадут ошибку. При преобразовании числовых выражений используются системные настройки (такие, как разделитель целой и дробной части и пр.).

Function CStr(Expression) As String
Приводит выражение к строковому типу данных. Правила интерпретации зависят от типа выражения. Null не обрабатывается и выдает ошибку, Empty интерпретируется как 0. Значения Boolean интерпретируются как "True" или "False", значения Date форматируются в соответствии с системным форматом короткой даты, выражения Error интерпретируются как текст ошибки, то же значение вернет Error(Expression). Все остальные числовые значения преобразуются в строку в соответствии с системными настройками и результат соответствует функции Format$(Expression).

Function CDate(Expression) As Date
Приводит выражение к типу данных Date. Null не обрабатывается и выдает ошибку, Empty интерпретируется как 30 декабря 1899 г. Обрабатывается любое выражение, которое может быть интерпретировано как дата. Если выражение является числовым, то это значение интерпретируется как число дней, прошедших с даты 30 декабря 1899 г. (значения могут быть дробными и отрицательными).

Function CVDate(Expression)
Функция полностью аналогична функции CDate, но возвращает тип данных не Date, а Variant, субтип Date. Функция оставлена для совместимости с предыдущими версиями Visual Basic.

Function CVErr(Expression)
Приводит выражение к типу Variant, субтипу Error, содержащему ошибку, определяемую пользователем. Null не обрабатывается и выдает ошибку, Empty интерпретируется как ошибка 0. Строковые выражения обрабатываются только если могут быть приведены к числовым выражениям, в противном случае они не будут обрабатываться и выдадут ошибку.

Остальные функции довольно банальны, навряд ли на них нужно останавливаться отдельно.


Модуль VBA.Interaction
Этот модуль тоже все знают, но именно в нем я и наткнулся на функции, о которых раньше не знал.

Function DoEvents() As Integer
Эта функция передает управление операционной системе (для обработки событий). Управление вернется когда операционная система завершит процесс обработки очереди событий и передаст нажатия клавиш, передаваемые в SendKeys. Кроме того, эта функция возвращает количество открытых окон, хотя навряд ли в этом есть практическая польза.
Вообще хочется сказать, что в правильно спроектированной задаче DoEvents не нужен. К сожалению это не так, иногда он все же нужен. Но когда случается использовать DoEvents, примите меры к тому, что бы процедура, из которой был вызван DoEvents, не получила управление из другой части вашего кода до того, как первый вызов будет завершен.

Function IIf(Expression, TruePart, FalsePart)
Если выражение может быть интерпретировано, как True, то функция возвращает выражение TruePart. В противном случае будет возвращено выражение FalsePart. Значение Null обрабатывается как False. Следует помнить, что перед тем, как функция будет вызвана, все ее аргументы будут вычислены, и соответственно код IIf(I=0,0,5/I) вызовет ошибку деления на ноль. Для таких случаев используйте блоки If...Else...EndIf.
Пример: Debug.Print IIf(Month(Now())=12,"сегодня декабрь","сегодня не декабрь")

Function Choose(Index As Single, ParamArray Choice() As Variant)
Функция возвращает аргумент с порядковым номером, соответствующим Index, нумерация аргументов начинается с 1. Если Index меньше 1 или больше максимального числа аргументов, то функция возвратит Null. Следует помнить, что функция вычисляет каждый аргумент в списке, несмотря на то, что возвращает только один. Чтобы этого избежать, используйте блоки Select Case.
Пример: Debug.Print Choose(Month, "январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь")

Function Switch(ParamArray VarExpr() As Variant)
Функция принимает пары аргументов и возвращает второй элемент из первой пары, значение первого элемента которой может быть интерпретировано как True. Null интерпретируется как False, но если Null встречается в первом выражении, то функция возвращает Null. Функция также возвращает Null, если во всех парах не было ни одного выражения, которое могло быть интерпретировано, как Null.
Пример: Debug.Print Switch(A=True And B=True, "оба аргумента установлены", A=True And B=False, "первый аргумент установлен, второй нет")
Вот эту функцию я и не знал, всегда использовал самодельную Decode, делающую то же самое. Ну разве что моя Decode могла еще иметь последний нечетный аргумент, используемый если все остальные пары не прошли.

Function Partition(Number, Start, Stop, Interval)
Функция возвращает строкове представление диапазона (задаваемого Start, Stop и Interval), в который попадает число Number. Диапазон представляется в виде num-start:num-end, строки форматируются по ширине пробелами, по длине максимального значения. Отрицательные значения для интервала не допускаются. Функция удобна для составления отчетов с группировкой.
Пример: Debug.Print Partition(1, 1, 100, 20) ' 1: 20
Пример: Debug.Print Partition(45, 1, 100, 20) ' 41: 60
Пример: Debug.Print Partition(-1, 1, 100, 20) ' : 0
Пример: Debug.Print Partition(120, 1, 100, 20) '101:
Про эту функцию я тоже не знал. А зря, функция иногда очень полезна.


Модуль VBA.Strings
А в этом модуле я наткнулся на функции, оканчивающиеся на B. Для работы с Unicode они очень полезны.
Но помимо них имеются и другие полезные функции.

Function Filter(SourceArray, Match As String, [Include As Boolean = True], [Compare As VbCompareMethod = vbBinaryCompare])
Функция "фильтрует" одномерный массив SourceArray и возвращает одномерный массив (начинающийся с нулевого элемента), в котором будут только те элементы исходного массива, имеющие вхождения строки Match.
Пример: Result() = Filter(Array("unpack success", "extract fail", "registration failed"), "fail")

Function Join(SourceArray, [Delimiter]) As String
Функция "склеивает" все элементы одномерного массива SourceArray, разделяя их указанным разделителем (по умолчанию пробел). К сожалению null-аргументы не допускаются, что снижает ее полезность. Но тем не менее есть смысл использовать эту функцию, чтобы не обрабатывать начальные/конечные разделители вручную.
Пример: Debug.Print Join(Array(Recordset!Surname,Recordset!Forename,Recordset!Patronymic), " ")

Function Split(Expression As String, [Delimiter], [Limit As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare])
Функция, обратная предыдущей. Создает из строки одномерный массив (начинающийся с нулевого элемента), разделяя ее по указанному разделителю.
Пример: Result() = Split("Иванов Иван Иванович", " ", 3)

Function StrComp(String1, String2, [Compare As VbCompareMethod = vbBinaryCompare])
Функция сравнивает две строки и возвращает результат сравнения. Функция удобна тем, что позволяет уточнять режим сравнения (бинарный или текстовый) и тем, что принимает null-аргументы.


Ну вот пожалуй все. Остальные функции достаточно банальны, их назначение легко понятно из названия и описания. Правда есть еще модуль VBA.Financial, но там функции специализированные.
Lasciate ogni speranza, voi ch'entrate.

Вернуться в Популярные вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList