В чем разница между 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 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

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

  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-переменная диапазона типов)

Set: вы устанавливаете свойство (здесь: установите значение r в диапазон ("A1") - это не тип, а значение).

вы должны использовать set с объектами, если r был простым типом (например, int, string), то вы просто напишете:

Dim r As Integer
r=5

Dim просто объявляет значение и тип.

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


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