В чем разница между 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`на самом деле все Вары одинаковы!