2016-12-26 61 views
-1

我有一個200x4陣列,我需要一個從第5行到第50行的子集,我該如何做到這一點沒有循環使用INDEX選擇數組部分

這是我心中的那種,有什麼建議嗎?

MYARRAY [5:50,]

這僅僅是在VBA中,沒有任何信息從Excel電子表格

+0

只是爲了確保你是從工作表單元格中讀取數組值?我們假設從第1行到第200行,並且您只想讀取第5行到第50行的值? –

+0

這些值是VBA中的另一個計算結果,沒有鏈接到Excel表格 –

+0

[此鏈接](https://usefulgyaan.wordpress.com/2013/06/12/vba-trick-of-the-week-slicing -an-array-without-loop-application-index /)應該提供一個技巧來做到這一點,但我無法讓它工作 – user3598756

回答

1

這是不可能的純VBA(儘管你可以得到一些使用你想用什麼Index function

你可以做的是寫一個抽象需要循環的切斷功能,使這確實切片的代碼是清潔喜歡的東西:

'Assumes 1-based arrays 

Function Slice(A As Variant, Optional RowRange As String = "", Optional ColRange As String = ""): 
    Dim i As Long, j As Long, rmin As Long, rmax As Long, cmin As Long, cmax As Long 
    Dim m As Long, n As Long 
    Dim S As Variant, Dims As Variant 

    If Len(RowRange) > 0 Then 
     Dims = Split(RowRange, ":") 
     rmin = Dims(0) 
     rmax = Dims(1) 
    Else 
     rmin = 1 
     rmax = UBound(A, 1) 
    End If 

    If Len(ColRange) > 0 Then 
     Dims = Split(ColRange, ":") 
     cmin = Dims(0) 
     cmax = Dims(1) 
    Else 
     cmin = 1 
     cmax = UBound(A, 2) 
    End If 

    m = rmax - rmin + 1 
    n = cmax - cmin + 1 

    ReDim S(1 To m, 1 To n) 
    For i = 1 To m 
     For j = 1 To n 
      S(i, j) = A(rmin + i - 1, cmin + j - 1) 
     Next j 
    Next i 

    Slice = S 
End Function 

的部分測試:

Sub test() 
    Dim A As Variant 
    A = Range("A1:C6").Value 'a 4x6 array 

    Range("E1:G3").Value = Slice(A, "2:4") 
    Range("E5:F10").Value = Slice(A, , "1:2") 
End Sub 

輸出:

enter image description here

不幸的是,Slice(A, "2:4",)是一個語法錯誤 - 在VBA函數調用,你不能用逗號結束參數列表即使其餘參數是可選的,因此Slice(A, "2:4")Slice(A, , "1:2")的不對稱也是如此。