【发布时间】:2023-02-14 23:12:27
【问题描述】:
请原谅我是 VBA 的新手。
有时我用
Dim r as Range
r = Range("A1")
其他时候我用
Set r = Range("A1")
有什么不同?我什么时候应该使用什么?
【问题讨论】:
请原谅我是 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 的示例是 Range、Worksheet 或 Workbook。它们有自己的方法和属性。
Dim myRange as Range
Set myRange = Sheet1.Range("A1")
如果您尝试使用没有Set 的最后一行,VB 将抛出错误。现在您已经声明了object,您可以访问它的属性和方法。
myString = myRange.Value
【讨论】:
Set而不首先使用Dim变量吗?
Dim r As Range
Setsets the variable to an object reference。
Set r = Range("A1")
但是,我认为这不是您真正要问的。
有时我使用:
Dim r as Range r = Range("A1")这永远行不通。如果没有
Set,您将收到运行时错误#91 Object variable or With block variable not set。这是因为你必须使用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设置为包含单元格“A1”的RangeSet 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有关默认对象属性的更多信息,请参阅Chip Pearson's "Default Member of a Class"。
至于你的
Set例子:其他时候我用
Set r = Range("A1")如果不首先声明
r是一个Range或Variant对象,这是行不通的……使用Dim声明——除非你没有启用Option Explicit,你应该这样做。总是。否则,您正在使用尚未声明的标识符,它们都被隐式声明为Variants。
【讨论】:
Dim:你正在定义一个变量(这里:r是Range类型的变量)
设置:您正在设置属性(此处:将 r 的值设置为 Range("A1") - 这不是类型,而是值)。
你必须对对象使用 set,如果 r 是一个简单类型(例如 int、string),那么你只需要写:
Dim r As Integer
r=5
【讨论】:
Dim 简单地声明了值和类型。
Set 为变量赋值。
【讨论】:
如果一个变量被定义为一个对象,例如Dim myfldr As Folder,使用关键字“Set”为其分配一个值。
【讨论】:
Dim是Dimension的缩写,在VBA和VB6中用于声明局部变量。
另一方面,设置与变量声明无关。 Set 关键字用于分配对象变量到新对象。
希望这能为您澄清差异。
【讨论】:
根据 VBA help on SET statement,它设置了对对象的引用。因此,如果更改属性,实际对象也会更改。
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`
实际上所有的变量都是一样的!
【讨论】: