Сводка вопроса
Когда я использую функцию VBA VarType
, передавая ей экземпляр класса Object
, доступный в справочнике библиотеки mscorlib.dll ( .NET ссылка на библиотеку), возвращаемое значение равно 8
.
Согласно документации VBA здесь , это означает, что объект является строкой. Это кажется смешным.
У меня вопрос: почему функция VarType
возвращает значение строкового типа для экземпляров этого класса Object
из ссылки VBA библиотеки .NET? Это ошибка?
Справочная информация
Я подозреваю, что тот факт, что функция VBA VarType
говорит о том, что определенный COM-объект является строкой, может быть причиной того, что у меня возникают проблемы с использованием функции DispCallFunc
в некоторых методах определенных COM объекты. COM-объекты - это COM-версии объектов .NET, доступные через .NET Framework.
Я использую ссылку VBA mscorlib.dll, чтобы получить функциональность раннего связывания для этих объектов. Ссылка относится к версии 4.0.30319 .NET Framework. На моем компьютере библиотека типов для справки хранится по адресу:
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.tlb
.
Похоже, когда метод объекта указывает, что аргумент или возвращаемое значение имеют тип System.Object
, DispCallFunc
не работает для меня. В любом случае, это отдельная проблема, которая косвенно связана с проблемой, которой посвящен этот вопрос.
На момент написания статьи я использую последнюю версию Excel (версия 1903, сборка 11425.20202). Моя операционная система Windows 8.1.
Когда я использую функцию VarType
с экземплярами других классов из библиотеки mscorlib.dll, я иногда получаю возвращаемые значения 9
& 13
(VbVarType.vbObject
& VbVarType.vbDataObject
константы), что кажется правильным.
Я проверил в Интернете, чтобы выяснить, не сталкивался ли кто-то еще с этой проблемой, но ничего не смог найти.
Код, который можно использовать для воспроизведения проблемы
Dim o As mscorlib.Object
Set o = New mscorlib.Object
Debug.Print "TypeName(o) = " & TypeName(o) ' TypeName function seems to work correctly.
Debug.Print "o.Equals(o) = " & o.Equals(o) ' System.Object.Equals method is working.
Debug.Print "VarType(CVar(o)) = " & VarType(CVar(o)) ' IMPORTANT LINE
' VBA VarType function says o is string (type 8) but it isn't?!
Debug.Print "VbVarType.vbString = " & VbVarType.vbString
Я ожидал, что VarType(CVar(o))
вернет 9
, 13
или другое подходящее целое число. Вместо этого он возвратил 8
, что кажется не совсем подходящим (8
представляет строки.)