В чем разница между dim и set в vba - PullRequest
71 голосов
/ 06 октября 2010

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

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

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

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

Set r = Range("A1")

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

Ответы [ 7 ]

69 голосов
/ 07 октября 2010

Нет смысла использовать set, если нет ссылки на ссылку на объект.Хорошей практикой является использование только в этом контексте.Для всех других простых типов данных просто используйте оператор присваивания.Однако рекомендуется dim (измерение) ВСЕХ переменных:

Примеры простых типов данных: integer, long, boolean, string.Это просто типы данных и не имеют своих собственных методов и свойств.

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

Примером object может быть Range, Worksheet или Workbook.У них есть свои методы и свойства.

Dim myRange as Range
Set myRange = Sheet1.Range("A1")

Если вы попытаетесь использовать последнюю строку без Set, VB выдаст ошибку.Теперь, когда вы объявили object, вы можете получить доступ к его свойствам и методам.

myString = myRange.Value
59 голосов
/ 12 ноября 2014

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

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

    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

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

  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 имеет значение свойства по умолчанию из Range("A1").

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

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

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

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


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

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

Set r = Range("A1")

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

7 голосов
/ 06 октября 2010

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

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

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

Dim r As Integer
r=5
4 голосов
/ 06 октября 2010

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

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

1 голос
/ 15 января 2018

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

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

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

1 голос
/ 12 июня 2013

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

0 голосов
/ 30 октября 2017

Согласно справке 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`

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...