В чем разница между dim и set в vba
извините меня, как новичок в VBA.
иногда я использую
Dim r as Range
r = Range("A1")
в других случаях я использую
Set r = Range("A1")
в чем разница? И когда я должен использовать что?
7 ответов
нет причин использовать 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 объектная переменная или переменная блока With не задана. Это потому, что ты должны использовать Set
для присвоения значения переменных ссылке на объект. Тогда код выше будет работа.
я думаю, что приведенный ниже код иллюстрирует то, что вы действительно спрашиваете. Предположим, мы не объявляем тип и пусть r
быть тип.
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
установлен до стоимостью на свойство по умолчанию ofRange("A1")
.r = Range("A1") ' TypeName(r) returns "String"
в этом случае свойством диапазона по умолчанию является .Value
, так что следующие две строки кода эквивалентны.
r = Range("A1")
r = Range("A1").Value
дополнительные сведения о свойствах объекта по умолчанию см. В разделе чип Пирсон "член класса по умолчанию".
что касается вашего Set
пример:
в других случаях я использую
Set r = Range("A1")
это не сработало бы без предварительного объявления этого r
это Range
или
Dim: вы определяете переменную (здесь: r-переменная диапазона типов)
Set: вы устанавливаете свойство (здесь: установите значение r в диапазон ("A1") - это не тип, а значение).
вы должны использовать set с объектами, если r был простым типом (например, int, string), то вы просто напишете:
Dim r As Integer
r=5
Если переменная определена как объект, например, Dim myfldr как папка, ей присваивается значение с помощью ключевого слова "Set".
Dim
является коротким для измерения и используется в VBA и VB6 для объявления локальных переменных.
Set с другой стороны, не имеет ничего общего с объявлениями переменных. The Set
ключевое слово используется для назначение переменная объекта для нового объекта.
надеюсь, что проясняет разницу для вас.
в соответствии с инструкцией VBA help on 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`
на самом деле все vars одинаковы!