Простите меня, как новичок в VBA.
Иногда я использую
Dim r as Range
r = Range("A1")
В других случаях я использую
Set r = Range("A1")
В чем разница? И когда я должен использовать что?
Простите меня, как новичок в 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
будет Range
, a Worksheet
или Workbook
. У них есть свои методы и свойства.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Если вы попытаетесь использовать последнюю строку без set
, VB выдает ошибку. Теперь, когда вы объявили object
, вы можете получить доступ к его свойствам и методам.
myString = myRange.Value
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"
В этом случае свойство по умолчанию для диапазона составляет .Value
, поэтому следующие две строки кода эквивалентны.
r = Range("A1")
r = Range("A1").Value
Подробнее о свойствах объектов по умолчанию см. Chip Pearson" Участник по умолчанию класса.
Что касается вашего примера Set
:
В других случаях я использую
Set r = Range("A1")
Это не сработает без предварительного объявления, что r
является объектом Range
или Variant
... с помощью оператора Dim
, если только у вас нет Option Explicit
, который вам нужно. Всегда. В противном случае вы используете идентификаторы, которые вы не объявили, и все они неявно объявлены как Варианты.
Dim: вы определяете переменную (здесь: r - переменная типа Range)
Set: вы устанавливаете свойство (здесь: установите значение r в Range ("A1") - это не тип, а значение).
Вы должны использовать set с объектами, если бы r был простым типом (например, int, string), то вы бы просто написали:
Dim r As Integer
r=5
Dim
просто объявляет значение и тип.
Set
присваивает значение переменной.
Если переменная определена как объект, например. Dim myfldr As Folder, ему присваивается значение с помощью ключевого слова "Установить".
Dim
является сокращением от Dimension и используется в VBA и VB6 для объявления локальных переменных.
Установить с другой стороны, не имеет ничего общего с объявлениями переменных. Ключевое слово 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`
Фактически все вары одинаковы!