Vba excel как определить тип переменной

В языке VBA есть универсальные типы данных, т.е. способные хранить как число, так и строку, дату и любой другой тип информации. Например, ячейка в таблице может содержать что угодно и изначально, программа не знает какой в ней тип данных хранится. Кроме того, в самой программе может использоваться тип данных Variant, который так же может содержать любое значение любого типа.

Чтобы определить какой тип данных в ячейке или в переменной типа Variant, можно воспользоваться несколькими способами.

Способ 1. Использовать функцию TypeName для определения типа данных

Эта функция возвращает строку с названием типа данных на английском. В качестве аргумента принимает переменную, значение ячейки.
Обратите внимание: Функция определяет только стандартные типы данных и не может определить пользовательский тип (определенный с помощью Type).

Возможные возвращаемые функцией значения:

Byte Число типа Byte
Integer Целое число
Long Длинное целое число
Single Число одиночной точности с плавающей запятой
Double Число двойной точности с плавающей запятой
Currency Валюта
Decimal Число с плавающей запятой
Date Дата
String Строка
Boolean Логическое
Error Ошибка
Empty Не проинициализировано (т.е. переменная не была объявлена)
Null Неверные данные (в переменной нет корректных данных)
Object Объект (класс)
Unknown Тип данных не известен
Nothing Объект, никуда не ссылающийся

Приведу несколько примеров по использованию TypeName.

Пример 1. Определение типа переменной.

Dim v As Integer
MsgBox TypeName(v) ' Выведет: Integer

Обратите внимание: если вы используете результат TypeName в условии, т.е. проверяете, соответствует ли тип данных определенному, например, Integer, то регистр символов возвращаемого типа имеет значение. Т.е. нужно писать Integer с заглавной буквы, либо использовать приведение всех символов к одному регистру.

Пример 2. Использование TypeName в условии.

Dim v As Integer
If TypeName(v) = "Integer" Then MsgBox "Yes" Else MsgBox "No"         ' Yes
If TypeName(v) = "integer" Then MsgBox "Yes" Else MsgBox "No"         ' No
If LCase(TypeName(v)) = "integer" Then MsgBox "Yes" Else MsgBox "No"  ' Yes

Пример 3. Определение типа данных в ячейке.

MsgBox TypeName(Cells(1, 1).Value) ' Выведет тип данных в ячейке A1

Если функции была передана переменная массив, она вернет тип данных в массиве с добавлением скобок.

Пример 4. Определение типа массива.

Dim Arr1(10) As Integer
Dim Arr2(10)
MsgBox TypeName(Arr1) ' Выведет: Integer()
MsgBox TypeName(Arr2) ' Выведет: Variant()

Способ 2. Проверка на возможность преобразования строки к нужному типу.

Бывает ситуация, когда значение, например, число или дата, содержится в строке. В этом случае TypeName вернет String, а не Integer или Date. Чтобы узнать, что содержится в строке, можно воспользоваться одной из функций IsNumeric, IsDate, IsObject, IsArray, IsNull, IsError.

IsNumeric Проверяет может ли выражение быть преобразовано в число
IsDate Проверяет может ли выражение быть преобразовано в дату
IsObject Проверяет, является ли переменная объектом
IsArray Проверяет, является ли переменная массивом
IsNull Проверка на пустое значение
IsError Проверка выражения на ошибку

Пример 4. Определение может ли переменная быть преобразована в число.

Dim v As String
If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no (т.к. в строке нет числа)
v = "120"
If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes
v = "120.45"
If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no
v = "test 120"
If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no
v = "120 test"
If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no

К сожалению, как видим из примера, нет возможности проверить, содержится ли в строке число с плавающей точкой.

Пример 5. Определение содержит ли переменная дату (может быть преобразована в дату).

Dim firstDate, secondDate As Date
Dim timeOnly, dateAndTime, noDate As String
firstDate = CDate("12.05.2017")
secondDate = #12/5/2017#
timeOnly = "15:45"
dateAndTime = "12.05.2017 15:45"
noDate = "Test"
If IsDate(firstDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes
If IsDate(secondDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes
If IsDate(timeOnly) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes
If IsDate(dateAndTime) Then MsgBox "yes" Else MsgBox "no" ' Выведет: yes
If IsDate(noDate) Then MsgBox "yes" Else MsgBox "no" ' Выведет: no

Проверка, содержится ли число или дата в ячейке листа делается аналогично, как и с переменными.

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

����������� ����� ����������

����������� ����� ����������

� VBA ������������� ����������� ��������� ���������� � ���� ����� ���������� �� ����� ���������� ���������. ������ ��� ���������� (��� ��� ��������, ������������� � ���������� ���� Variant) ����� ����������� ���������.

1.���� ������������� ����������� � VBA ���� ����� ������������ ������� VarType. � �������� ��������� ��� ��������� ������������� ���������� ��� ����������� �������� ���������� ����. ������������ ���� �������� �������� � �� ����������� ��������� � ����. 1.8.

������� 1.8. ��������, ������������ �������� VarType

����������

������� VarType ���������� �������� vbArray ������ � ����� �� ���������, ���������������� ��� ��������� �������. ��������, ��� ������� ����� ������� ��������� �������� 8192 + 8 = 8200. �������� �� vbVariant ������������ ������ � ����� �� ��������� vbArray � ������ ��� �������� � ���������� ���� Variant.

2.���� ����������� ���� ���������� ����� ������������ ���������� ������� TypeName. � �������� ��������� ��� ��������� ������������� ���������� ��� ����������� �������� ���������� ����. ���������� ������ ������� ������ (��� String) � ������ ���� ���������, �������� �Integer�, �String�, �Workbook�, �Object�. ������ ������� ����� ������� ��������� ������������� ��������, �������� ������� ��������� � ����. 1.9.

������� 1.9. ������������� ��������, ������������ �������� TypeName

3.���� ���� ����� ���������� ��� �������, �� ������� ��������� ������, ��������� ������������ ���������� TypeOf, ������� ��������� ������: TypeOf ������ Is �������������_����. ������ ���������� ���������� �������� True, ���� ������ � ������ ������ ��������� �� ������, ��� ���� �������� ������������� ��������� �������������_����. � ��������� ������ ������������ �������� False. ��������, ���� obj � ������ �� ������ Worksheet, �� � ���������� ���������� ���������� TypeOf obj Is Worksheet �������� �������� True.

����������

���������� TypeOf �������� ������ ��� ������, ������� ��������, �������� �� Nothing. ���� � �������� ��������� �������������_���� ������������ Object, �� ����������� ���������� ���������� ����� �������� True ���������� �� ���� �������, �� ������� ��������� ������.

На чтение 7 мин Просмотров 1.6к. Опубликовано 07.11.2020

Содержание

  1. Способ 1. Использовать функцию TypeName для определения типа данных
  2. Способ 2. Проверка на возможность преобразования строки к нужному типу.
  3. TypeName и TypeOf. Рекомендуется TypeName and TypeOf…Is
  4. Запуск примера To run the example

В языке VBA есть универсальные типы данных, т.е. способные хранить как число, так и строку, дату и любой другой тип информации. Например, ячейка в таблице может содержать что угодно и изначально, программа не знает какой в ней тип данных хранится. Кроме того, в самой программе может использоваться тип данных Variant, который так же может содержать любое значение любого типа.

Чтобы определить какой тип данных в ячейке или в переменной типа Variant, можно воспользоваться несколькими способами.

Способ 1. Использовать функцию TypeName для определения типа данных

Эта функция возвращает строку с названием типа данных на английском. В качестве аргумента принимает переменную, значение ячейки.
Обратите внимание: Функция определяет только стандартные типы данных и не может определить пользовательский тип (определенный с помощью Type).

Возможные возвращаемые функцией значения:

Byte Число типа Byte
Integer Целое число
Long Длинное целое число
Single Число одиночной точности с плавающей запятой
Double Число двойной точности с плавающей запятой
Currency Валюта
Decimal Число с плавающей запятой
Date Дата
String Строка
Boolean Логическое
Error Ошибка
Empty Не проинициализировано (т.е. переменная не была объявлена)
Null Неверные данные (в переменной нет корректных данных)
Object Объект (класс)
Unknown Тип данных не известен
Nothing Объект, никуда не ссылающийся

Приведу несколько примеров по использованию TypeName.

Пример 1. Определение типа переменной.

Обратите внимание: если вы используете результат TypeName в условии, т.е. проверяете, соответствует ли тип данных определенному, например, Integer, то регистр символов возвращаемого типа имеет значение. Т.е. нужно писать Integer с заглавной буквы, либо использовать приведение всех символов к одному регистру.

Пример 2. Использование TypeName в условии.

Пример 3. Определение типа данных в ячейке.

Если функции была передана переменная массив, она вернет тип данных в массиве с добавлением скобок.

Пример 4. Определение типа массива.

Способ 2. Проверка на возможность преобразования строки к нужному типу.

Бывает ситуация, когда значение, например, число или дата, содержится в строке. В этом случае TypeName вернет String, а не Integer или Date. Чтобы узнать, что содержится в строке, можно воспользоваться одной из функций IsNumeric, IsDate, IsObject, IsArray, IsNull, IsError.

IsNumeric Проверяет может ли выражение быть преобразовано в число
IsDate Проверяет может ли выражение быть преобразовано в дату
IsObject Проверяет, является ли переменная объектом
IsArray Проверяет, является ли переменная массивом
IsNull Проверка на пустое значение
IsError Проверка выражения на ошибку

Пример 4. Определение может ли переменная быть преобразована в число.

К сожалению, как видим из примера, нет возможности проверить, содержится ли в строке число с плавающей точкой.

Пример 5. Определение содержит ли переменная дату (может быть преобразована в дату).

Проверка, содержится ли число или дата в ячейке листа делается аналогично, как и с переменными.

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

Универсальные объектные переменные (т. е. переменные, объявляемые как Object ) могут содержать объекты из любого класса. Generic object variables (that is, variables you declare as Object ) can hold objects from any class. При использовании переменных типа Object может потребоваться выполнить различные действия в зависимости от класса объекта. Например, некоторые объекты могут не поддерживать определенное свойство или метод. When using variables of type Object , you may need to take different actions based on the class of the object; for example, some objects might not support a particular property or method. Visual Basic предоставляет два способа определения типа объекта, хранящегося в объектной переменной: функция TypeName и оператор TypeOf. Is . Visual Basic provides two means of determining which type of object is stored in an object variable: the TypeName function and the TypeOf. Is operator.

TypeName и TypeOf. Рекомендуется TypeName and TypeOf…Is

Функция TypeName возвращает строку и является лучшим выбором, если необходимо сохранить или отобразить имя класса объекта, как показано в следующем фрагменте кода: The TypeName function returns a string and is the best choice when you need to store or display the class name of an object, as shown in the following code fragment:

Оператор TypeOf. Is является лучшим выбором для тестирования типа объекта, так как он гораздо быстрее, чем эквивалентное сравнение строк с помощью TypeName . The TypeOf. Is operator is the best choice for testing an object’s type, because it is much faster than an equivalent string comparison using TypeName . В следующем фрагменте кода используется TypeOf. Is в инструкции If. Then. Else : The following code fragment uses TypeOf. Is within an If. Then. Else statement:

В этом случае следует соблюдать осторожность. A word of caution is due here. Оператор TypeOf. Is возвращает True , если объект относится к конкретному типу или является производным от определенного типа. The TypeOf. Is operator returns True if an object is of a specific type, or is derived from a specific type. Почти все, что выполняется с Visual Basic, включает объекты, которые включают в себя некоторые элементы, которые обычно не считаются объектами, например строками и целыми числами. Almost everything you do with Visual Basic involves objects, which include some elements not normally thought of as objects, such as strings and integers. Эти объекты являются производными от Objectи наследуют от них методы. These objects are derived from and inherit methods from Object. При передаче Integer и вычислении с Object оператор TypeOf. Is возвращает True . When passed an Integer and evaluated with Object , the TypeOf. Is operator returns True . В следующем примере сообщается, что параметр InParam является как Object , так и Integer : The following example reports that the parameter InParam is both an Object and an Integer :

В следующем примере используются как TypeOf. Is , так и TypeName для определения типа объекта, переданного в него в аргументе Ctrl . The following example uses both TypeOf. Is and TypeName to determine the type of object passed to it in the Ctrl argument. TestObject процедура вызывает ShowType с тремя различными видами элементов управления. The TestObject procedure calls ShowType with three different kinds of controls.

Запуск примера To run the example

Создайте новый проект приложения Windows и добавьте в форму элемент управления Button, CheckBox и элемент управления RadioButton. Create a new Windows Application project and add a Button control, a CheckBox control, and a RadioButton control to the form.

С помощью кнопки в форме вызовите процедуру TestObject . From the button on your form, call the TestObject procedure.

Добавьте в форму следующий код: Add the following code to your form:

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

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

В языке выделяют следующие типы: Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String, Object, Variant.

Byte целые числа от 0 до 255;
Boolean логические значения — True/False;
Integer целые числа от -32768 до 32767;
Long целые числа от -2147483648 до 2147483647;
Currency вещественные числа (целая часть до 15 цифр, дробная до 4 цифр) от -922337203685477,5808 до 922337203685477,5807;
Single вещественные числа одинарной точности от -3.4e38 до +3.4e38
Double вещественные числа одинарной точности от -3.4e38 до +3.4e38
Date дата и время от 1 Января 100 до 31 Декабря 9999;
String текст
Object объект или ссылка на объект;
Variant объект или ссылка на объект;

Если переменная указана вне функции или модуля и объявлена в разделе Declarations, то она является глобальной или Public и доступ к ней возможен из других модулей.

Переменная типа Private доступна только в пределах одного модуля, но из любой функции данного модуля.

Переменная находящаяся внутри функции или модуля доступна локально и обращение к ней возможно только из функции или модуля.

Так же существует тип локальной переменной Static, она позволяет сохранять прежнее значение, объявленное при инициализации.

А зачем, вы спросите, иметь информацию о типе переменной в ходе работы программы ? Ведь это делает программист. Опаньки :-). В VBA есть тип переменной Variant, который может быть любого типа за исключением пользовательского. Не верите ? Смотрите код:

Sub Test()
	Dim string_var As String
	Dim int_var As Integer
	Dim test_variant As Variant
	string_var = "Hello Variant"
	int_var = 123
	test_variant = string_var
	test_variant = int_var
End Sub

Как видите, и Variant можно передавать в процедуры, поэтому определение типа нужно, конечно если подобными вещами вы будете пользоваться. Для определения кода есть функция TypeName (…), которая вернет строку с именем переменной. Вот так, например, можно её использовать:

Sub Test()
	Dim string_var As String
	Dim int_var As Integer
	Dim test_variant As Variant
	string_var = "Hello Variant"
	int_var = 123
	test_variant = string_var
	MsgBox (TypeName(test_variant))
	test_variant = int_var
	MsgBox (TypeName(test_variant))
End Sub

Кроме этого есть ряд вспомогательных функций позволяющих получить информацию о переменных. IsArray позволяет проверить является ли переменная массивом.

Sub Test()
	Dim arr_var(10) As String
	If IsArray(arr_var) Then
		MsgBox ("Массив")
End Sub

IsEmpty проверка инициализации (наличия) переменной. Запустите код ниже, а потом раскомментируйте строку.

Sub Test()
	' Dim arr_var As String
	If IsEmpty(arr_var) Then MsgBox ("NO")
End Sub

IsDate проверяет можно ли преобразовать переменную к типу даты. Ниже надпись YES появится один раз.

Sub Test()
	Dim arr_var As String
	arr_var = "01.01.1998"
	If IsDate(arr_var) Then
		MsgBox ("YES")
	arr_var = "41.01.1998"
	If IsDate(arr_var) Then
		MsgBox ("YES")
End Sub

Так же проверяется можно ли перевести в число IsNumeric:

Sub Test()
	Dim arr_var As String
	arr_var = "not numeric"
	If IsNumeric(arr_var) Then MsgBox ("YES")
	arr_var = "1998"
	If IsNumeric(arr_var) Then MsgBox ("YES")
End Sub

Есть еще ряд подобных функций:

  • IsObject — проверка, что переменная обьект
  • IsNull(выражение) — проверка на пустое значение
  • IsError(выражение) — проверка выражения, представляет ли оно значение ошибки

TypeName

TypeName(VarName)

Функция TypeName определяет тип данных переменной или свойства объекта

Возвращаемое значение

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

Список возвращаемых значений

Byte Byte
Integer Integer
Long Long
Single Single
Double Double
Currency Currency
Decimal Decimal
Date Date
String String
Boolean Boolean
Variant(Error) Error
Variant(Empty) Empty
Variant(Null) Null
Object Object
Объект неизвестного типа Unknown
Объектная переменная, не содержащая ссылки на объект Nothing

Примечание

Если аргумент представляет массив, то возвращается одна из перечисленных выше строк (или Variant) с добавлением пустых скобок. Например, если аргумент представляет массив целых значений, то функция возвращает строку «Integer()»

Параметры

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

Пример

Dim myVar
myVar = "Русский_Проект"
Print TypeName(myVar) 'возвращается String

Категория
Функции обработки строк

Like this post? Please share to your friends:
  • Vba excel как определить содержимое ячейки
  • Vba excel как открыть проект
  • Vba excel как определить размер массива
  • Vba excel как открыть книгу только для чтения
  • Vba excel как определить последнюю заполненную строку