2015-08-20 2 views
2

Я наткнулся на какое-то поведение, которое я не понимаю. Рассмотрим следующую функцию:VBA Тип объекта

Function identity(n As Integer) As Integer 
    identity = n 
End Function 

Очевидно, что это не самая практичная функция, но она хорошо освещает мою проблему.

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

Однако, если я изменю вывод как объект, я все равно ожидаю, что это сработает, поскольку, как я понимаю, целые числа являются объектами. Увы, вместо этого я получаю «ошибку в Value».

Это также происходит, если оба типа ввода и вывода изменены на объекты.

Функция проявляет поистине любопытное поведение, когда ввод изменен на объект, но выход остается целым числом. Если он вызывается из excel через '= identity (3)', это ошибки, но если он вызывается через '= identity (A1)', где A1 содержит 3, он возвращает правильное значение.

Может ли кто-нибудь объяснить, что происходит? Я новичок в VB, но я запрограммирован на разных языках ранее, и я никогда ничего подобного не видел ...

ответ

3

Если n является объектом и identity возвращает объект, то в VBA:

Set identity = n 

типы объектов необходимо использовать Set и не объектные типы как Integer не используют Set

редактировать в ответ на комментарий ниже, 3 является Integer буквальным. Целое число не является типом объекта и не может рассматриваться как одно целое.

Возможно, вы найдете Variant type, поскольку он может содержать как объекты, так и не-объекты. Затем вы можете использовать TypeName, чтобы точно определить, с чем имеете отношение, и действуйте соответственно.

+0

Это все еще не выполняется для '= identity (3)'. Есть ли какой-нибудь корневой класс, который я могу использовать? Я бы подумал, что это Object ... – DomJack

+0

Я добавил дополнительные сведения об объекте и не-объекте в VBA – barrowc

2

Целые объекты не являются объектами VBA. Set неявно устанавливает указатель на объект (определяемый пользователем или встроенный). Переменная Integer сохраняет ее значение более непосредственно.

4

Если это предназначено для использования в более крупной цели, возможно, вы можете использовать тип варианта.

Function identity(v As Variant) As Variant 
    identity = v 
End Function 

?identity("K") & "E" 
KE 

?identity("2") + 2 
4 
?identity(2) + 2 
4 
?identity(2) & 2 
22 

?identity("K") & 2 
K2 

?identity("K") + 2 
Run-time error '13': Type mismatch 

VBA считается язык loose-typed (так называемый 'слабый типизированных') программирования так что добавление "2" + 2 и 2 + 2 дают одинаковый результат.

Смежные вопросы