В чем разница между dim и set в vba


Простите меня как новичка в VBA.

иногда я использую

Dim r as Range
r = Range("A1")

в других случаях я использую

Set r = Range("A1")

в чем разница? И когда я должен использовать что?

7 59

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 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

Итак, давайте разбейте то, что здесь происходит.

  1. r объявляется как вариант

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. r установлен до Range содержит ячейку "A1"

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. r установлен до стоимостью на свойство по умолчанию of Range("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 просто объявляет значение и тип.

Set присваивает значение переменной.

Если переменная определена как объект, например 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`

на самом деле все Вары одинаковы!