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

52

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

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

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

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

Set r = Range("A1")

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

Теги:
excel-vba
vb6

6 ответов

57
Лучший ответ

Нет причин использовать 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
  • 3
    Могу ли я узнать, на какой учебник или книгу вы ссылались, чтобы понять это?
  • 15
    Этот ответ на самом деле не объясняет "почему"
Показать ещё 2 комментария
44

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

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

    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, который вам нужно. Всегда. В противном случае вы используете идентификаторы, которые вы не объявили, и все они неявно объявлены как Варианты.

  • 2
    Отличный ответ
  • 0
    @PierreClaverie Да :) это включает в себя оригинальные ссылки для Dim и Set
Показать ещё 3 комментария
7

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

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

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

Dim r As Integer г = 5

  • 0
    Разве эта последняя строка не должна быть Dim r as Integer: r=5 или иметь разрыв строки? Не думайте, что вы можете затемнить и назначить так в VBA. - редактировать: только что заметил возраст этого поста. Оставит комментарий здесь, так как он все еще действителен, хотя
3

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

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

1

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню