2017-03-08 265 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