Подтвердить что ты не робот

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

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

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

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

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

Set r = Range("A1")

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

4b9b3361

Ответ 1

Нет причин использовать 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

Ответ 2


Однако, я не думаю, что это то, о чем вы действительно спрашиваете.

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

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

Это никогда не сработает. Без Set вы получите ошибку времени выполнения # 91 Объектная переменная или с заблокированной переменной блока. Это связано с тем, что вы должны использовать 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 установлено значение свойства по умолчанию Range("A1").

    r = Range("A1") ' TypeName(r) returns "String"
    

В этом случае свойство по умолчанию для диапазона составляет .Value, поэтому следующие две строки кода эквивалентны.

r = Range("A1")
r = Range("A1").Value

Подробнее о свойствах объектов по умолчанию см. Chip Pearson" Участник по умолчанию класса.


Что касается вашего примера Set:

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

Set r = Range("A1")

Это не сработает без предварительного объявления, что r является объектом Range или Variant... с помощью оператора Dim, если только у вас нет Option Explicit, который вам нужно. Всегда. В противном случае вы используете идентификаторы, которые вы не объявили, и все они неявно объявлены как Варианты.

Ответ 3

Dim: вы определяете переменную (здесь: r - переменная типа Range)

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

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

Dim r As Integer
r=5

Ответ 4

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

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

Ответ 5

Если переменная определена как объект, например. Dim myfldr As Folder, ему присваивается значение с помощью ключевого слова "Установить".

Ответ 6

Dim является сокращением от Dimension и используется в VBA и VB6 для объявления локальных переменных.

Установить с другой стороны, не имеет ничего общего с объявлениями переменных. Ключевое слово Set используется для назначения переменной объекта новому объекту.

Надеюсь, это прояснит разницу для вас.

Ответ 7

В соответствии с инструкцией VBA в инструкции 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`

Фактически все вары одинаковы!