Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在vba中,dim和set之间有什么区别_Excel_Vba_Vb6 - Fatal编程技术网

Excel 在vba中,dim和set之间有什么区别

Excel 在vba中,dim和set之间有什么区别,excel,vba,vb6,Excel,Vba,Vb6,请原谅,我是VBA的新手 有时我用 Dim r as Range r = Range("A1") Set r = Range("A1") Set r = Range("A1") 其他时候我用 Dim r as Range r = Range("A1") Set r = Range("A1") Set r = Range("A1") 有什么区别?什么时候我应该使用什么?Dim:您正在定义一个变量(这里:r是一个Range类型的变量) Set:您正在设置属性(此处:将r的值设置为范围(“

请原谅,我是VBA的新手

有时我用

Dim r as Range
r = Range("A1")
Set r = Range("A1")
Set r = Range("A1")
其他时候我用

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

有什么区别?什么时候我应该使用什么?

Dim:您正在定义一个变量(这里:r是一个Range类型的变量)

Set:您正在设置属性(此处:将r的值设置为范围(“A1”)——这不是一个类型,而是一个值)

必须对对象使用set,如果r是简单类型(例如int、string),则只需编写:

Dim r As Integer
r=5

Dim
只声明值和类型


Set
为变量赋值。

除非引用对象引用,否则没有理由使用
Set
。只有在这种情况下才使用它是一种良好的做法。对于所有其他简单数据类型,只需使用赋值运算符。最好对所有变量进行
调暗
(维度)但是:

简单数据类型的示例有
整数
布尔
字符串
。这些只是数据类型,没有自己的方法和属性

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"
对象的一个例子是
范围
工作表
,或
工作簿
。它们有自己的方法和属性

Dim myRange as Range
Set myRange = Sheet1.Range("A1")
如果您试图使用最后一行而不设置
,VB将抛出一个错误。现在您已经声明了一个
对象
,您可以访问它的属性和方法

myString = myRange.Value

如果变量定义为对象,例如Dim myfldr as Folder,则使用关键字“Set”为其赋值。

  • Dim

  • 设置


然而,我认为这不是你真正想要的

有时我使用:

    Dim r as Range
    r = Range("A1")
这是行不通的。如果没有
设置
,您将收到运行时错误。这是因为必须使用
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”的
    范围

  • r
    设置为
    范围(“A1”)
    默认属性的值

  • 在这种情况下,范围的默认属性是
    .Value
    ,因此以下两行代码是等效的

    r = Range("A1")
    r = Range("A1").Value
    
    有关默认对象属性的详细信息,请参阅


    至于您的
    集合
    示例:

    其他时候我用

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

    如果不首先声明
    r
    是一个
    范围
    变量
    对象,这将不起作用。。。使用
    Dim
    语句-除非未启用
    选项Explicit
    ,否则应启用该选项。总是。否则,您将使用未声明的标识符,并且它们都隐式声明为。

    根据VBA帮助on 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
    
    其他变量属性也会更改,因此:

    Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`
    

    实际上所有的变量都是一样的

    Dim
    是维度的缩写,在VBA和VB6中用于声明局部变量

    另一方面,Set与变量声明无关。
    Set
    关键字用于将对象变量分配给新对象


    希望这能为您澄清区别。

    我能知道您参考了哪本教程或书来理解这一点吗?这个答案并不能真正解释VBA非常聪明的原因,它不需要您告诉它您在做什么,就像很多语言一样。然而,这增加了时间。如果你在各种不同的变量上使用了一整套不同维度的数据,那么时间就加起来了。如果您告诉VBA当它看到一个变量时会发生什么,那么它就不必计算出来。另外,如果您告诉VBA变量是整数而不是字符串,那么它就不会占用那么多内存。虽然后一点在常见的小型VBA项目中可能不太有效,但它仍然是一种良好的编码实践。使用
    Set
    而不首先使用
    Dim
    ing变量可以吗?@PierreClaverie是:)它包括Dim和Set@Wolf不确定你是否意识到,但是VBA语言ref现在在github上维护@RubberDuck我不知道(我是vb*新手),谢谢你添加了这张便条。欢迎@Wolf。我知道现在很难找到VBA和旧的VB6文档。