在VBA中声明数组变量

3

声明数组变量时,这三种样式有什么区别:

Dim MyArr1 As Variant
Dim MyArr2() As Variant
Dim MyArr3()

这三个变量都是动态变量吗?

我找不到一个对这三个变量进行比较的文档链接。

更新。当执行下面这两段代码时,我真的看不出有什么区别:

代码1

Dim MyArr
MyArr = Range("a1:c10").Value

代码 2

Dim MyArr() As Variant
MyArr = Range("a1:c10").Value

不管我们使用上述三种方式中的哪一种声明数组,只要我们想要从范围中读取值并将它们赋给数组,这是否真的很重要呢?

MyArr=Range("A1:C10").Value

执行上面的代码时,变量声明发生在填充值之前。就好像我们有一行隐藏的代码:

Dim MyArr(10,3) As Variant '10 rows, and 3 columns

当我们从范围中读取数据时,MyArr是否变成静态数组变量?


如果您没有使用Option Explicit,则可以执行MyArr4 = array()而无需使用Dim - user10417531
@reportgunner 嗯,我们不应该建议关闭 Option Explicit,实际上我们应该建议始终将其打开。 - Pᴇʜ
1
区别在于 Dim MyArr() 明确地是一个数组,你不能赋值给它 MyArr = 5 将会失败。但是 Dim MyArr 完全未定义,可以被赋值为某个值 MyArr = 5 或者一个数组 MyArr = Range("a1:c10").Value 或者一个范围 Set MyArr = Range("a1:c10")。因此,如果要声明一个变量,尽可能具体。这意味着如果你想执行 MyArr = Range("a1:c10").Value,那么一定要将其声明为数组 Dim MyArr() As Variant,这是最具体的选项。这样就不会有人将其他东西放到其中了。 - Pᴇʜ
@PEH,你的评论是我问题的接受答案。 - Przemyslaw Remin
@PrzemyslawRemin 把它作为答案发布了,所以你可以将其标记为已解决。 - Pᴇʜ
显示剩余2条评论
3个回答

3

Dim MyArr1 As Variant - MyArr1是具有Variant类型的变量。
Variant类型可以容纳任何数据类型或对象。

以下两个都是一样的。它们是动态数组,其大小在设计时不知道。

Dim MyArr2() As Variant
Dim MyArr3()

Sub ArayTest()

    Dim MyArr1 As Variant
    Dim MyArr2() As Variant
    Dim MyArr3()

    MyArr1 = 10
    MyArr1 = #1/30/2019#

    '--> You cannot directly assign value to array
    'MyArr2 = 20
    'MyArr3 = 30

    '--> Use Redim to set the size of array

    ReDim MyArr2(1)
    MyArr2(0) = "abc"
    MyArr2(1) = 1324

    '--> variant can hold object
    MyArr1 = Array(1, "s", #1/30/2019#)
End Sub

enter image description here


你的意思是说MyArr1不是一个数组?我可以用MyArr1=[NamedRange].Value来填充它,而NamedRange可以由任何矩形大小的单元格组成,比如A1:B10。 - Przemyslaw Remin
MyArr1 是一个具有变量数据类型的变量。 - Santosh
它是一个数组变量还是不是? - Przemyslaw Remin
@PrzemyslawRemin MyArr1 是一个 Variant,这意味着它可以是任何东西,取决于你放入的内容。如果你放入一个字符串 MyArr1 = "ABC",那么它就是一个 Variant/String。如果你放入一个数组 MyArr1 = Array("a", "b", "c"),那么它就是一个 Variant/Array。你无法仅凭声明来确定它的类型。 - Pᴇʜ
@PrzemyslawRemin 变量的定义可以接受任何类型。如果你将一个数组或者一个返回数组的函数的结果分配给 MyArr1,它将是一个数组。 - user10417531

2
Variant可以是任何东西,正如我们在Variant数据类型中所读到的那样:

Variant数据类型是所有未明确声明为其他类型(使用Dim、Private、Public或Static等语句)的变量的数据类型。

Variant数据类型没有类型声明字符。

您可以使用Variant数据类型来代替任何数据类型

这基本上意味着Dim MyArr1 As Variant意味着MyArr1也可以是一个变体数组。
但是最后两个意味着您正在声明“任何东西”的Array,但只有第一个可以是任何东西 :)

你能解释一下你的句子“但是最后两个意味着你声明了一个“任何东西”的数组,但只有第一个可以是任何东西 :)”吗?听起来有点哲学 :) - Przemyslaw Remin
1
@PrzemyslawRemin 将 Variant 视为“任何东西”,甚至可以是 Variant 数组或任何其他数据类型。但最后两个是变量数组,因此它们不能是 Integer 等,但它们可以是 Integer 数组,它们可以是任何东西的数组,但它们不能是任何东西(它们是数组)。 - Michał Turczyn

2
最初的回答:

在IT技术中,Dim MyArr()Dim MyArr() As Variant(它们是相同的)与Dim MyArrDim MyArr As Variant(它们也是相同的)之间的区别在于Dim MyArr()绝对是一个数组,你不能给它赋值:MyArr = 5将会失败。
Dim MyArr则完全未定义,可以分配...

  • 一个值MyArr = 5(将会成功)
  • 一个数组MyArr = Range("a1:c10").Value
  • 一个范围Set MyArr = Range("a1:c10")

因此,如果您声明一个变量,应尽可能具体。这意味着如果您想要执行

MyArr = Range("a1:c10").Value

那么,始终确保将其声明为数组Dim MyArr() As Variant,这是此处最具体的选项。因此,没有人可以将其他东西放入其中,而不是数组。您越具体,您的代码就越安全。

此外,每个编程人员都知道变量 Dim MyVar()应该是一个数组,而在 Dim MyVar中,他们不知道期望值是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接