Вибачте мене, як новачка у 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")
Однак я не думаю, що це насправді ви просите.
Іноді я використовую:
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
вміщує комірку "А1"
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
прикладу:
Інший раз використовую
Set r = Range("A1")
Це не спрацювало б без попереднього оголошення про те, що r
це Range
або Variant
об'єкт ... за допомогою Dim
оператора - якщо ви не Option Explicit
ввімкнули, що слід. Завжди. В іншому випадку ви використовуєте ідентифікатори, які ви не оголосили, і всі вони неявно оголошені як варіанти .
Dim: ви визначаєте змінну (тут: r - змінна типу Range)
Встановити: ви встановлюєте властивість (тут: встановіть для значення r значення Range ("A1") - це не тип, а значення).
Вам потрібно використовувати set з об’єктами, якби r був простим типом (наприклад, int, рядок), то ви просто написали б:
Dim r As Integer
r=5
Dim
просто оголошує значення та тип.
Set
присвоює значення змінної.
Якщо змінна визначена як об'єкт, наприклад, Dim myfldr як папка, їй присвоюється значення за допомогою ключового слова "Встановити".
Dim
це скорочення від Dimension і використовується у VBA та VB6 для оголошення локальних змінних.
Набір, з іншого боку, не має нічого спільного з оголошеннями змінних. 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 також змінюються, отже:
Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
насправді всі вари однакові!