В чем разница между 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
, aWorksheet
илиWorkbook
. Они имеют свои собственные методы и свойства.Dim myRange as Range Set myRange = Sheet1.Range("A1")
если вы попытаетесь использовать последнюю строку без
Set
, VB выдаст ошибку. Теперь, когда у вас естьobject
заявили, Вы можете получить доступ к его свойствам и методам.myString = myRange.Value
Dim r As Range
Set
наборы переменная для ссылки на объект.Set r = Range("A1")
однако, я не думаю, что это то, что вы действительно спрашиваете.
иногда я использую:
Dim r as Range r = Range("A1")
это никогда не будет работать. Без
Set
вы получили сообщение об ошибке во время выполнения #91 объектная переменная или переменная блока With не задана. Это потому что ты должны использовать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
установлен до стоимостью на свойство по умолчанию 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-переменная типа Range)
Set: вы устанавливаете свойство (здесь: установите значение r в диапазон("A1") - это не тип, а значение).
вы должны использовать set с объектами, если бы r был простым типом (например, int, string), то вы бы просто написали:
Dim r As Integer r=5
Если переменная определена как объект, например Dim myfldr как папка, ей присваивается значение с помощью ключевого слова "Set".
Dim
сокращенно от Dimension и используется в VBA и VB6 для объявления локальных переменных.Set с другой стороны, не имеет ничего общего с объявлениями переменных. Элемент
Set
ключевое слово используется для назначение объектная переменная для нового объекта.надеюсь, что это проясняет для вас разница.
в соответствии с инструкцией VBA help on SET он устанавливает ссылку на object.so если вы измените свойство, фактический объект также изменится.
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`
на самом деле все Вары одинаковы!