Excel VBA – 根据条件从范围插入行到数组; 然后使用数组中的数据填充另一个工作表上的某些范围

我的VBA知识非常有限。 我查看了StackOverflow上的问题,并search了几天,但找不到解决scheme。

所以,我正在处理一个Excelmacros。 我有一个范围A3:H7136。 列A中的某些单元格的值为1; 其余的都是空白的。 D,E,F,G,H列中的单元格可能是空白的,也可能包含文本或数字。

我想要做的是取A3:H7136的范围,并把数据放入一个数组; 排除具有空白A单元格和空白D单元格的行; 转换为“最终”数组,将数据从第2,4和8列粘贴到另一个工作表上的范围D309:D558,G309:G558,J309:J558。

到目前为止,我有以下几点:

Private Sub CommandButton1_Click() Dim RowArray() As Long Dim my_array1 As Range Dim my_array2 As Variant Dim i As Integer Set my_array1 = ThisWorkbook.Worksheets("ETC").Range("A3:H7136") my_array2 = my_array1.Value For i = 1 To UBound(my_array2) If my_array2(i, 1) = 1 And my_array2(i, 4) <> "" Then RowArray(x) = i: x = x + 1 End If Next i Sheets("Allocation").Range("D309:D558") = Application.Index(my_array2, 1, Array(4)) Sheets("Allocation").Range("J309:J558") = Application.Index(my_array2, 1, Array(2)) End Sub 

我停在那里,因为我意识到代码粘贴#value! 进入另一个工作表上的范围。 这个代码是来自几个论坛的“Frankenstein-ed”,所以对专业人士来说可能看起来很怪异。 我需要帮助让代码工作。 我也有几个问题:

  1. 如果“最终”数组是100%空白(可能发生),我该如何摆脱#Value! 在另一个工作表上?
  2. 在最后两行,它看起来像我使用原来的my-array2 ,而不是它的“最终”过滤版本。 我应该宣布“最终”arrays?
  3. 我的粘贴范围只有250行; 数组中非空行的数量将不会超过250行,但是,这种差异会成为问题吗?

提前致谢!

几件事情:

RowArray的大小从来没有被声明,所以它会抛出一个界限的错误。

您可以使用三个数组作为循环中的输出,然后直接将数组分配给所需的区域。

 Private Sub CommandButton1_Click() Dim DArray() As Variant Dim GArray() As Variant Dim JArray() As Variant Dim my_array2 As Variant Dim i As Long, x As Long Dim cnt As Long cnt = ThisWorkbook.Worksheets("ETC").Evaluate("COUNTIFS(A3:A7136,1,D3:D7136,""<>"")") If cnt > 0 Then ReDim DArray(1 To cnt, 1 To 1) As Variant ReDim GArray(1 To cnt, 1 To 1) As Variant ReDim JArray(1 To cnt, 1 To 1) As Variant my_array2 = ThisWorkbook.Worksheets("ETC").Range("A3:H7136").Value x = 1 For i = 1 To UBound(my_array2) If my_array2(i, 1) = 1 And my_array2(i, 4) <> "" Then DArray(x, 1) = my_array2(i, 4) GArray(x, 1) = my_array2(i, 4) JArray(x, 1) = my_array2(i, 8) x = x + 1 End If Next i Sheets("Allocation").Range("D309").Resize(UBound(DArray, 1), 1).Value = DArray Sheets("Allocation").Range("G309").Resize(UBound(GArray, 1), 1).Value = GArray Sheets("Allocation").Range("J309").Resize(UBound(JArray, 1), 1).Value = JArray End If End Sub