繁体   English   中英

Excel VBA:大量数字的范围数组,如何进行delcare

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM