Простите меня, поскольку я новичок в VBA.
Иногда я использую
Dim r as Range
r = Range("A1")
В других случаях я использую
Set r = Range("A1")
В чем разница? И когда что использовать?
Нет причин использовать, set
если только не ссылка на объект. Рекомендуется использовать его только в этом контексте. Для всех остальных простых типов данных просто используйте оператор присваивания. Однако рекомендуется dim
(измерить) ВСЕ переменные:
Примеры простых типов данных было бы integer
, long
, boolean
, string
. Это просто типы данных и не имеют собственных методов и свойств.
Dim i as Integer
i = 5
Dim myWord as String
myWord = "Whatever I want"
Примером object
может быть a Range
, a Worksheet
или a Workbook
. У них есть свои методы и свойства.
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
Если вы попытаетесь использовать последнюю строку без Set
, VB выдаст ошибку. Теперь, когда у вас есть object
объявление, вы можете получить доступ к его свойствам и методам.
myString = myRange.Value
Set
безDim
предварительной переменной?Dim
объявляет переменную .Dim r As Range
Set
устанавливает переменную в ссылку на объект .Set 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"
В этом случае свойство Range по умолчанию равно
.Value
, поэтому следующие две строки кода эквивалентны.r = Range("A1") r = Range("A1").Value
Дополнительные сведения о свойствах объекта по умолчанию см. В статье Чипа Пирсона «Член класса по умолчанию» .
Что касается вашего
Set
примера:Это не сработает, если предварительно не объявить, что
r
это объектRange
илиVariant
... с помощьюDim
оператора - если вы неOption Explicit
включили, что вам следует. Всегда. В противном случае вы используете идентификаторы, которые вы не объявили, и все они неявно объявлены как Варианты .источник
Dim: вы определяете переменную (здесь: r - это переменная типа Range)
Set: вы устанавливаете свойство (здесь: установите значение r равным Range ("A1") - это не тип, а значение).
Вы должны использовать набор с объектами, если бы r был простым типом (например, int, string), вы бы просто написали:
Dim r As Integer r=5
источник
Dim
просто объявляет значение и тип.Set
присваивает значение переменной.источник
Если переменная определена как объект, например, Dim myfldr As Folder, ей присваивается значение с помощью ключевого слова «Set».
источник
Dim
является сокращением от Dimension и используется в VBA и VB6 для объявления локальных переменных.Set, с другой стороны, не имеет ничего общего с объявлениями переменных.
Set
Используется ключевое слово , чтобы назначить переменную объекта на новый объект.Надеюсь, это проясняет вам разницу.
источник
Согласно справке 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 также меняются, поэтому:
на самом деле все вары одинаковы!
источник