2015-08-23 4 views
2

я мог объявить массив таким образом:В чем разница между `Array` и` Array() `?

Dim arrTest() As Variant 

или таким образом:

Dim arrTest2 As Variant 
arrTest2 = Array() 

однако, первый может быть передан только в качестве аргумента, например так:

Sub(ByRef arrTest() As Variant) 

и второй например:

Sub(ByRef arrTest2 As Variant) 

вы можете сделать это с второй:

ReDim arrTest2(UBound(arrTest2) + N) 

но не с первым.

В чем разница между объявленным первым способом массивом переменных и массивом переменных, объявленным вторым?
Они оба одинаковы vartype() - 8204 - Array of variants
Почему макросы относятся к ним по-другому?

ответ

4

Первый - это множество вариантов. Это всегда массив - его нельзя переназначить, например. диапазон. Второй вариант - это вариант, который может содержать практически все, включая массив (который он делает в этом случае). Рассмотрим следующий код:

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:

enter image description here

Обратите внимание, как тип arrTest является Variant() но arrTest2 является Variant/Variant(0 to -1). Они действительно не такие же. arrTest - массив, поэтому он должен следовать синтаксису VBA относительно массива. arrTest2 не является массивом вообще - это простая переменная (варианта варианта), поэтому она соответствует синтаксису VBA простых (не массивных) переменных. Тот факт, что в этом конкретном случае он указывает на массив, не делает его переменной массива.

Если вы знакомы с C, ваш вопрос похож на вопрос, что многие начинающие программисты на С спрашивают о разнице между int и int*, только в каком-то смысле это более таинственное здесь с тем, что функции, такие как varType и TypeName неявно разыменовывать любую переменную варианта, возможно, является конструктивным недостатком.В некотором роде было бы неплохо, если бы typename(arrTest2) вернул бы более точный (хотя и более подробный) Variant/Variant() в этом случае.

+0

* Второй вариант, который может содержать практически все ... * Да, они даже добавили поддержку для хранения переменной UDT в рамках варианта. Один тип, который по-прежнему НЕ МОЖЕТ быть сохранен в варианте, представляет собой строку с фиксированной длиной. –

+0

@ExcelHero Интересно - я не знал, что есть что-то, о чем нельзя было бы поговорить. –

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