[英]Excel vba: Array of Ranges of huge numbers, how to delcare
我有一个函数,它从工作表中获取范围并将它们存储在数组中:
Function test()
Dim resultArray(1 To 3, 1 To 2) As Range
Set resultArray(1, 1) = ThisWorkbook.Worksheets("setup").Range("A1:A1000")
Set resultArray(2, 1) = ThisWorkbook.Worksheets("setup").Range("B1:B1000")
Set resultArray(3, 1) = ThisWorkbook.Worksheets("setup").Range("C1:C1000")
Set resultArray(1, 2) = ThisWorkbook.Worksheets("setup").Range("D1:D1000")
Set resultArray(2, 2) = ThisWorkbook.Worksheets("setup").Range("E1:E1000")
Set resultArray(3, 2) = ThisWorkbook.Worksheets("setup").Range("F1:F1000")
test=resultArray
End Function
但是,我不确定声明数组的正确方法是什么。 如果我将其声明As Range
如何将这些值存储在内部? 数字很大,甚至Long也无法存储它们。 如果我将数组声明As Range
或其他内容,数字是否存储As Variant
? 给定我的情况该如何声明数组?
我应该选择什么-声明As Range
还是As Variant
?
尝试这样:
Option Explicit
Public Sub TestMe()
Dim myArr As Variant
myArr = Application.Transpose(Range("A1:A3"))
Debug.Print LBound(myArr)
Debug.Print UBound(myArr)
Debug.Print myArr(1)
Debug.Print myArr(2)
End Sub
注意-请注意,在此示例中,数组将以1
开头,而不是以0
开头。 这是使用函数的方法:
Option Explicit
Public Sub TestMe()
Debug.Print ReturnArray(1)
Debug.Print ReturnArray(2)
Debug.Print LBound(ReturnArray); UBound(ReturnArray)
End Sub
Public Function ReturnArray() As Variant
ReturnArray = Application.Transpose(Range("A1:A3"))
End Function
如果将数据放在一行中,要使其成为一维数组,可以将其转置两次。
像这样:
Option Explicit
Public Sub TestMe()
Dim myArr As Variant
myArr = ReturnArrayHorizontal
Debug.Print myArr(1)
Debug.Print UBound(myArr)
Debug.Print LBound(myArr)
End Sub
Public Function ReturnArrayHorizontal() As Variant
With Application
ReturnArrayHorizontal = .Transpose(.Transpose(Range("A1:E1")))
End With
End Function
编辑:要从具有许多列和行的范围中获取多维数组,请想象您具有以下内容:
然后尝试玩这个:
Public Sub Testing()
Dim resultArray As Variant
resultArray = Range("A1:F10")
Debug.Print resultArray(1, 1)
Debug.Print resultArray(10, 6)
End Sub
不知道要尝试实现什么,但这是定义数组的一种方法
Function test() ' returns an array
Dim resultArray
resultArray = ThisWorkbook.Worksheets("setup").Range("A1:A1000")
'resultarray is now an array (1 to 1000,1 to 1)
test = resultArray
End Function
如果使用SET,则可以有效地存储指向范围对象的指针,而不是范围所包含的值。 您可以将SET与一个变量一起使用,该变量将包含一个范围对象指针,或者更直接地,您可以将SET与范围变量一起使用。
要检索数据,最有效的方法是将range.value2分配给变量。 您不需要确定变体的尺寸或使用Transpose-变体将包含一个二维变体数组。
不确定数据的使用情况,通常这可能或多或少地建议采用这种方法。
关于数据类型:Excel中的所有数值都存储为Double
。 小心,有时数字以文本形式存储,因此不作为数字处理。 但...
您不能将数组声明为Double
,因为您不是在构建普通数组,而是在嵌套数组。 即使是普通数组,也无法一次分配所有范围,因为Range.Value
返回Variant()
并且VBA无法在不同数组类型之间进行转换。 这样,您唯一的选择是使用Variant
。 您也可以使用Range
,但是这样就不会缓存值,而只是在数组中获取范围引用!
因此,您唯一的解决方案是:
Function test()
Dim resultArray(1 To 3, 1 To 2) 'As Variant <- implict
resultArray(1, 1) = ThisWorkbook.Worksheets("setup").Range("A1:A1000")
resultArray(2, 1) = ThisWorkbook.Worksheets("setup").Range("B1:B1000")
resultArray(3, 1) = ThisWorkbook.Worksheets("setup").Range("C1:C1000")
resultArray(1, 2) = ThisWorkbook.Worksheets("setup").Range("D1:D1000")
resultArray(2, 2) = ThisWorkbook.Worksheets("setup").Range("E1:E1000")
resultArray(3, 2) = ThisWorkbook.Worksheets("setup").Range("F1:F1000")
test = resultArray
End Function
但是,我认为,最好的选择是一次缓存所有数据:
Function test()
test = ThisWorkbook.Worksheets("setup").Range("A1:F1000")
End Function
附录-关于对象/值分配:
要分配对象,必须始终使用Set
。 使用Let
(通常会省略)来分配值。 当您尝试将一个对象分配给一个值时,将调用默认成员,如果它是一个值,则将为其分配。 如果对象没有默认成员或默认成员不是值,则将收到运行时错误438-对象不支持此属性或方法。 在下面的示例中, obj
将被分配一个Range
对象实例,而val
将接收范围值(所有四个语法都完全相同)。 最后,由于Worksheet
没有默认属性,因此nop
将导致错误。
Set obj = Range(...)
Let val = Range(...).Value
val = Range(...).Value
Let val = Range(...)
val = Range(...)
nop = ActiveSheet
最后,VBA将数组视为值,因此您可以通过一次分配复制整个数组:
arr1 = Array(...)
arr2 = arr1 'arr2 will turn a copy of arr1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.