我试图找到这个,但我不能!是否可以将/复制和VBA阵列移动到范围变量 ,我不是说Range单元格,它是您声明的范围(例如: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
谢谢!
答案 0 :(得分:2)
即使Range在代码中声明,它仍然是Range,而不是数组。如果myArray实际上是一个Range对象(在这种情况下你应该重新考虑你的命名约定),你应该能够做你的例子所展示的。
但是如果你的变量myArray是某种其他类型的对象(比如和数组),你就不能像这样设置它,你必须编写一个将myArray转换为范围的方法。
修改强>
我猜测Range("A1:A4") = myArray
有效的原因是因为赋值运算符已被重载以支持Range("A1:A4").Value = myArray
的简写。
但是,Range不仅仅是一个数组,它是一个特定于工作簿范围的数据结构
当你声明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
答案 1 :(得分: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 dimsensional aray,代码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