Простите меня, поскольку я новичок в VBA.
Иногда я использую
Dim r as Range
r = Range("A1")
В других случаях я использую
Set r = Range("A1")
В чем разница? И когда что использовать?
Ответы:
Нет причин использовать, set
если только не ссылка на объект. Рекомендуется использовать его только в этом контексте. Для всех остальных простых типов данных просто используйте оператор присваивания. Однако рекомендуется dim
(измерить) ВСЕ переменные:
Примеры простых типов данных было бы integer
, long
, boolean
, string
. Это просто типы данных и не имеют собственных методов и свойств.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Примером object
может быть a Range
, a Worksheet
или a Workbook
. У них есть свои методы и свойства.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Если вы попытаетесь использовать последнюю строку без Set
, VB выдаст ошибку. Теперь, когда у вас есть object
объявление, вы можете получить доступ к его свойствам и методам.
myString = myRange.Value
Set
без Dim
предварительной переменной?
Dim
объявляет переменную .
Dim r As Range
Set
устанавливает переменную в ссылку на объект .
Set r = Range("A1")
Однако я не думаю, что вы действительно спрашиваете об этом.
Иногда использую:
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
включили, что вам следует. Всегда. В противном случае вы используете идентификаторы, которые вы не объявили, и все они неявно объявлены как Варианты .
Dim: вы определяете переменную (здесь: r - это переменная типа Range)
Set: вы устанавливаете свойство (здесь: установите значение r равным Range ("A1") - это не тип, а значение).
Вы должны использовать набор с объектами, если бы r был простым типом (например, int, string), вы бы просто написали:
Dim r As Integer
r=5
Dim
просто объявляет значение и тип.
Set
присваивает значение переменной.
Если переменная определена как объект, например, Dim myfldr As Folder, ей присваивается значение с помощью ключевого слова «Set».
Dim
является сокращением от Dimension и используется в VBA и VB6 для объявления локальных переменных.
Set, с другой стороны, не имеет ничего общего с объявлениями переменных. Set
Используется ключевое слово , чтобы назначить переменную объекта на новый объект.
Надеюсь, это проясняет вам разницу.
Согласно справке VBA по оператору SET, он устанавливает ссылку на объект. Поэтому, если вы измените свойство, фактический объект также изменится.
Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue
другие свойства Vars также меняются, поэтому:
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
на самом деле все вары одинаковы!