繁体   English   中英

Excel VBA-根据条件从范围到数组插入行; 然后使用数组中的数据填充另一张纸上的某些范围

[英]Excel VBA - insert rows from range to array based on criteria; then populate certain ranges on another sheet with data from array

我的VBA知识非常有限。 我浏览了StackOverflow上的问题,然后用谷歌搜索了几天,但是找不到解决我问题的方法。

因此,我正在处理Excel宏。 我的范围是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 ,而不是它的“最终”过滤版本。 我应该声明“最终”数组吗?
  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM