Первый - это множество вариантов. Это всегда массив - его нельзя переназначить, например. диапазон. Второй вариант - это вариант, который может содержать практически все, включая массив (который он делает в этом случае). Рассмотрим следующий код:
Sub test()
Dim arrTest() As Variant
Dim arrTest2 As Variant
arrTest2 = Array()
Debug.Print "arrTest is a " & TypeName(arrTest)
Debug.Print "arrTest2 is a " & TypeName(arrTest2)
End Sub
Когда вы запустите ее, вы получите это:
arrTest is a Variant()
arrTest2 is a Variant()
Который является то, что поражает вас, как странно. Если они одинаковы, почему VBA иногда воспринимает их как разные?
Ответ - они не такой же тип! typename
(или только varType
), при применении к переменной варианта не возвращает тип переменных вообще. Вместо этого он возвращает подтип переменной (концепция, которая имеет смысл только для вариантов). Для того, чтобы получить более ясную картину того, что происходит, - поставил точку останова до первого Debug.Print
заявления, запустить его и открыть Locals Window
:
Обратите внимание, как тип arrTest
является Variant()
но arrTest2
является Variant/Variant(0 to -1)
. Они действительно не такие же. arrTest
- массив, поэтому он должен следовать синтаксису VBA относительно массива. arrTest2
не является массивом вообще - это простая переменная (варианта варианта), поэтому она соответствует синтаксису VBA простых (не массивных) переменных. Тот факт, что в этом конкретном случае он указывает на массив, не делает его переменной массива.
Если вы знакомы с C, ваш вопрос похож на вопрос, что многие начинающие программисты на С спрашивают о разнице между int
и int*
, только в каком-то смысле это более таинственное здесь с тем, что функции, такие как varType
и TypeName
неявно разыменовывать любую переменную варианта, возможно, является конструктивным недостатком.В некотором роде было бы неплохо, если бы typename(arrTest2)
вернул бы более точный (хотя и более подробный) Variant/Variant()
в этом случае.
* Второй вариант, который может содержать практически все ... * Да, они даже добавили поддержку для хранения переменной UDT в рамках варианта. Один тип, который по-прежнему НЕ МОЖЕТ быть сохранен в варианте, представляет собой строку с фиксированной длиной. –
@ExcelHero Интересно - я не знал, что есть что-то, о чем нельзя было бы поговорить. –