2017-03-08 202 views
0

我想在Excel VBA中使用Application.Index函數。我現在有一個數組(4,11139),我試圖拼接成兩個單獨的數組,其中一個包含前兩行(2,11139),另一個包含第三/第四行(2,11139)。各種搜索建議這個代碼是正確的方法,但它不能正常工作:(我已經凝結的代碼是什麼相關)vba application.index行中的Array()不起作用

Dim Adjusted_Data_Array() As Single 
Dim Final_Data_Array() As Variant 
Dim Sys1_Data_Array() As Variant 
Dim Sys2_Data_Array() As Variant 
'Function that creates a 4,11139 variant array 
Final_Data_Array = Strip_Erroneous(Adjusted_Data_Array, 1) 
'Splice first two rows 
Sys1_Data_Array = Application.Index(Final_Data_Array, Array(1, 2), 0) 
'splice 3/4th rows 
Sys2_Data_Array = Application.Index(Final_Data_Array, Array(3, 4), 0) 

所以我現在應該有2個陣列,每個陣列包含從上半年數據陣列。但是我在新數組中獲得的是一個具有兩行的一維數組。像這樣: Screenshot of the watches from the 3 arrays discussed above.

我已經試過它與列中的數組(1,2),並且不起作用。

我可以解決這個問題,通過簡單地分裂成4個單獨的一維數組(工作正常,它是數組(1,2)或數組(3,4),似乎並不。知道在今後的工作中來了我會需要拼接更大的陣列,所以想了解爲什麼它不提前非常感謝 該工作準備

編輯:。 嘗試使用:

Sys1_Data_Array = Application.Index(Final_Data_Array, Application.Transpose(Array(1, 2)), 0) 

根據下面的查爾斯建議,但最終與數組的簡單切換索引如下所示: Screenshot of watches from transpose(array(1,2) attempt

+0

我不相信'INDEX'函數可以接受一個數組作爲'row_num'或'column_num'參數。如果其中一個是零;另一個必須指向單個行/列。 –

+0

感謝羅恩我開始懷疑,我不知道如何解釋這一點,但:https://usefulgyaan.wordpress.com/2013/06/12/vba-trick-of-the-week-slicing-an -array-without-loop-application-index /然後,還有更多的示例指出其他人以這種形式使用它。 –

+0

在註釋中有一些用戶在使用'row_num'的數組參數時無法使文章中的示例工作。另請注意,如果使用完全限定的'application.worksheetfunction.index ...',那麼當您使用'Array(1,2)'參數時,將會出現類型錯誤匹配。 –

回答

1

您可以使用該索引的方法,如果你換一個移調

var1 = Application.Index(varData, Application.Transpose(Array(1, 2)), 0) 
var2 = Application.Index(varData, Application.Transpose(Array(3, 4)), 0) 


道歉內部數組:其實這也不行!

但是它比使用VBA複製陣列的相關部分要慢2.5倍左右。

For k = 1 To UBound(varData, 2) 
    For j = 1 To 2 
     var1(j, k) = varData(j, k) 
     var2(j, k) = varData(j + 2, k) 
    Next 
Next 
+0

謝謝查爾斯,但仍然不能正常工作。我現在有一個2,1陣列,而不是之前的那個陣列。編輯上面的原始帖子來顯示它。看起來我正在用循環寫一個函數,所以我的代碼保持良好和整潔。 –

0
TheAddress = "row(1:2)" 
TheRows = Application.Evaluate(TheAddress) 'must be a 2 dimensions array 
TheColumns = Array(1, 2, 3)'must be a 1 dimension array 
Sys1_Data_Array = Application.Index(Final_Data_Array, TheRows, TheColumns) 
Cells(9, 1).Resize(UBound(Sys1_Data_Array), UBound(Sys1_Data_Array, 2)) = Sys1_Data_Array