2017-08-25 55 views
-1

我有一個函數,它從一個工作表範圍,並將其存儲在一個數組:Excel的VBA:龐大的數字範圍的陣列,如何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值是如何存儲在內部的?數字是巨大的,甚至龍不能存儲它們。如果我聲明數組As Range還是別的什麼,是否存儲號碼As Variant?鑑於我的情況,我應該如何聲明陣列?

我應該選擇什麼 - 申報As RangeAs Variant

+0

Excel不處理「巨大的數字」。你可能有'雙'或數字存儲爲'字符串'。 –

回答

1

不知道你的數據,通常可以把這種做法或多或少可取的使用。

關於數據類型:在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將接收範圍值(所有四種語法完全相同)。 最後nop將導致錯誤,因爲Worksheet沒有默認屬性。

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 
+0

因此,如果我使用'As Variant',那麼即使我沒有聲明'... = Range(...)。Value',它仍然指定Range的值?我想我只是指向數據的好處 - 我需要這些數組以後再搜索它們的值。我最大的擔憂是,使用'作爲範圍'時,會以某種方式截斷數字,但是您說它會被存儲爲'Double',所以沒關係,我猜... – Ans

+1

@ans檢查附錄,還有一些註釋。 –

+0

謝謝,我明白了! – Ans

2

嘗試這樣的:

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 

如果你有一排數據,使它的一個維數組,你可以調換兩次。 enter image description here

像這樣:

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 

編輯:若要從範圍多維數組與許多列和行,想象你具備以下條件:

enter image description here

然後試着打與此:

Public Sub Testing()   
    Dim resultArray As Variant   
    resultArray = Range("A1:F10")   
    Debug.Print resultArray(1, 1) 
    Debug.Print resultArray(10, 6)   
End Sub 
+0

爲什麼使用'Transpose'?我的初始化有什麼問題? – Ans

+0

@Ans - 轉置允許您轉到1維。 – Vityata

+0

@vityata - 使用轉置通常效率低於直接使用2維 –

1

不知道你努力實現,但這裏有什麼辦法來定義數組

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 
+0

我嘗試實現將變量範圍存儲在變量中,以便訪問更快。我的方法有什麼問題?你爲什麼不用'As'? – Ans

+0

您有1列的範圍,並返回2維數組。這是更多的1維。 – Vityata

+0

@Vityata我將數組設置爲所有維度,我只是不認爲它與問題相關,並沒有複製所有代碼。 – Ans

1

如果您使用SET,那麼你得到有效的存儲指針的範圍對象,而不是該範圍包含的值。你可以使用帶變量的SET,然後它將包含一個範圍對象指針,或者更直接地,你可以使用帶範圍變量的SET。

檢索數據的最有效方法是分配給range.value2一個變種。您不需要對變體進行尺寸標註或使用移調 - 變體將包含變體的二維數組。

+0

謝謝。考慮到我需要在以後搜索這些範圍 - 存儲指針或值,什麼會更有效? – Ans

+1

從VBA到Excel的每次調用都有很大的開銷,因此通常使用變量數組值更有效。 –