Однако я не думаю, что это то, о чем вы действительно спрашиваете.
Иногда я использую:
Dim r as Range
r = Range("A1")
Это никогда не сработает. Без Set
вы получите ошибку времени выполнения # 91 Переменная объекта или С переменной блока не установлено . Это потому, что вы должны использовать Set
для назначения значения переменной для ссылки на объект. Тогда код выше будет работать .
Я думаю, что приведенный ниже код иллюстрирует то, о чем вы действительно спрашиваете. Давайте предположим, что мы не объявляем тип и пусть r
будет типом Variant
.
Public Sub test()
Dim r
debug.print TypeName(r)
Set r = Range("A1")
debug.print TypeName(r)
r = Range("A1")
debug.print TypeName(r)
End Sub
Итак, давайте разберемся, что здесь происходит.
r
объявлен как вариант
`Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
r
устанавливается на Range
содержащую ячейку "A1"
Set r = Range("A1") ' TypeName(r) returns "Range"
r
имеет значение свойства по умолчанию из Range("A1")
.
r = Range("A1") ' TypeName(r) returns "String"
В этом случае свойство Range по умолчанию имеет значение .Value
, поэтому следующие две строки кода эквивалентны.
r = Range("A1")
r = Range("A1").Value
Подробнее о свойствах объекта по умолчанию см. Чип Пирсона "Член класса по умолчанию" .
Что касается вашего Set
примера:
В другой раз я использую
Set r = Range("A1")
Это не сработает, если сначала не объявить, что r
- это объект Range
или Variant
... с использованием оператора Dim
- если у вас не включен Option Explicit
, что вам следует. Всегда. В противном случае вы используете идентификаторы, которые вы не объявили, и все они неявно объявлены как Variants .