0

我试图找到这个,但我不能!是否可以将 VBA 数组移动/复制到范围变量,我不是说范围单元格,它是您声明的范围(例如:DIM 作为范围运行)

我想要这样的东西:

Public Function test()

Dim ran As Range
Dim myArray(4) As Integer

myArray(1) = 1
myArray(2) = 2
myArray(3) = 3
myArray(4) = 4

'If I do this, it works!
Range("A1:A4") = myArray

'But I want this and it does not work!
ran = myArray

End Function

谢谢!

4

2 回答 2

2

即使 Range 是在代码中声明的,它仍然是Range,而不是数组。如果 myArray 实际上是一个 Range 对象(在这种情况下,您应该重新考虑您的命名约定),您应该能够按照您的示例进行操作。

但是,如果您的变量 myArray 是其他类型的对象(如数组),您不能只是这样设置它,您必须编写一个将 myArray 转换为范围的方法。

编辑:

我猜想它Range("A1:A4") = myArray起作用的原因是因为赋值运算符已被重载以支持它作为Range("A1:A4").Value = myArray.

然而,范围不仅仅是一个数组,它是特定于工作簿范围的数据结构

当你声明Dim ran As Range你还没有真正初始化你的 Range 对象时。我猜如果您执行以下操作,它将起作用:

Dim ran As Range("A1:A4")
Dim myArray(4) As Integer

myArray(1) = 1
myArray(2) = 2
myArray(3) = 3
myArray(4) = 4

ran = myArray
于 2013-08-28T17:51:12.693 回答
0

如果将变量设置为工作表范围,则会得到一个二维数组。尝试这个

Sub MoveArray()

Dim myArray

myArray = Range("A1:B3").Value

Range("A6:B8").Value = myArray


End Sub

或这个

Sub MoveArray2()

Dim myArray
Dim myArray2
Dim myRange
Dim i As Integer
Dim j As Integer

myArray = Range("A1:B3").Value

Set myRange = Range("A6:B8")
For i = 1 To myRange.Rows.Count
    For j = 1 To myRange.Columns.Count
        myRange.Cells(i, j) = myArray(i, j)
    Next j
Next i

myArray2 = myRange

End Sub

在任何一种情况下,变体都会变成一个数组而不是一个范围对象,并且循环从数组中设置范围的值。

编辑

正如您从该线程的问题/答案中的评论中看到的那样,范围不是数组,它是一个具有许多属性和方法的复杂对象。属性之一(我认为默认属性)是值。此属性实际上是范围内单元格值的二维数组(或至少表现得像一个)。因此,如果 myArray 也是 2 维数组,则代码myRange = myArray将执行。将发生的情况是将范围引用的单元格的值设置为数组中的值。范围指的是这些单元格,但改变的是单元格中的值而不是范围对象。

因此,如果您将范围转移到不同的单元格集,则新的单元格集将保留其值。

实际上,如果要更改范围引用的单元格的值,可以按如下所示进行:

Sub Test1()

Dim myArray(1 To 4, 1 To 1)
Dim myRange As Range

myArray(1, 1) = 1
myArray(2, 1) = 2
myArray(3, 1) = 3
myArray(4, 1) = 4

Set myRange = Range("A1:A4")
myRange = myArray

End Sub
于 2013-08-28T17:50:40.797 回答