VBA从数组填充范围

时间:2017-10-11 14:56:24

标签: arrays excel vba

我创建了一个在满足条件时填充的数组 - 到目前为止一直很好。 现在,满足条件的值需要复制到另一个工作表。

其实我还有问题: 1.我首先无法获得该范围内的值。 2.如果满足条件,则数组为每行存储4列(范围)。是否可以确定每个数组列并将其粘贴到特定列中(在数组中,列彼此相邻,但在目标表中它们不是)。

这是我到目前为止的代码:

Sub determineDelta()
'Start determination and copy values to Delta sheet
Worksheets("Source").Activate
Range("A2").Select
numberOfRecords = Range(Selection, Selection.End(xlDown)).Rows.Count + 1

Dim myArray() As Variant
ReDim myArray(1 To 500) As Variant
Dim i, j, k As Integer
k = 0
ReDim myArray(numberOfRecords, k) As Variant

    For i = 2 To numberOfRecords
        If IsError(Application.Match(Cells(i, "A").Value, Sheets("SE16N").Range("A:A"), 0)) Then
            For j = 2 To 6
                myArray(j, k) = Cells(i, j).Value
                Debug.Print myArray(j, k)
            Next j
            k = k + 1
            ReDim Preserve myArray(numberOfRecords, k)
        End If
    Next i

Worksheets("Delta").Activate
Range("I2:I" & UBound(myArray)) = "FI"
Range("J2:J" & UBound(myArray)) = "A"
Range("M2").Resize(UBound(myArray), 1).Value = Application.Transpose(myArray)
End Sub

我一直在网上看了2天,包括cpearson。在这篇关于array sizing(在底部)的文章中,它指出了#N / A.这就是我所拥有的!但是不要。 : - )

我觉得我不是那么遥远,如果它只是一个相对较小的东西就不会感到惊讶。

我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:1)

添加了一些建议,不确定这是否是您所需要的。

Sub determineDelta()
    'Start determination and copy values to Delta sheet
    Worksheets("Source").Activate
    Range("A2").Select
    numberofrecords = Range(Selection, Selection.End(xlDown)).Rows.count + 1

    Dim myArray() As Variant
    'Unnecessary code
    'ReDim myArray(1 To 500) As Variant
    Dim i, j, k As Integer
    k = 0
    'ReDim myArray(numberOfRecords, k) As Variant
    ReDim myArray(numberofrecords, 2 To 6) As Variant

    For i = 2 To numberofrecords
        '[1]
        If Not IsError(Application.Match(Cells(i, "A").Value, Sheets("SE16N").Range("A:A"), 0)) Then
            For j = 2 To 6
                '[2]
                'myArray(j, k) = Cells(i, j).Value
                'Debug.Print myArray(j, k)
                myArray(k, j) = Cells(i, j).Value
            Next j
            k = k + 1
            'Since we already have a large enough array, no need to redim here
            'ReDim Preserve myArray(numberofrecords, k)
        End If
    Next i

    With Worksheets("Delta")
        .Range("I2:I" & UBound(myArray)) = "FI"
        .Range("J2:J" & UBound(myArray)) = "A"
        '[3]
        '.Range("M2").Resize(UBound(myArray), 1).Value = Application.Transpose(myArray)
        .Range("M2").Resize(UBound(myArray), 5).Value = myArray
    End With
End Sub

[1]: 如果以下公式中存在错误,IsError将返回TRUE。如果在表格中找到了单元格(i," A")(" SE16N"),它就不会进入for循环。因此,myArray将始终捕获不在表格中的值(" SE16N")。添加NOT运算符后,只能找到能够加载到myArray的项目。但是,如果您需要捕获未在表格中显示的值(" SE16N"),则原点是正确的。

[2]: 你声称一个阵列大约有一百行,但你只能访问#2到#6行,这是一种浪费。我将(j,k)改为(k,j),所以希望可以使用大部分数组。

[3]: 由于我交换了行和列,因此不再需要对数组进行转置。在原始代码中,调整范围大小将为您提供包含多行且只有一列的范围。因此,只有数组的第一列可以复制到工作表中,如果我错了,可以随意将5更改为1。

如果您需要将数据粘贴到单独的列中,我会想到两种方法。 1.您可以在开始时将数据存储到不同的阵列中。 2.循环遍历数组,例如:

Set OriginCell = Range("M2")
Set OriginCell2 = Range("Q2")
For i = 0 to UBound(myArray)
    OriginCell.Offset(i).Value = myArray(i, 2)
    OriginCell2.Offset(i).Value = myArray(i, 3)
Next i

答案 1 :(得分:1)

非常感谢。当我用您的评论更改上述代码时,它可以正常工作。 [1]是的,如果价值不存在,则需要做点什么。所以我没有改变这一部分。 [2]我想我仍然需要阅读更多关于数组的信息,因为这对我来说并非100%清楚。 [3]太棒了。不知道有可能。

是的,数组中的列需要转到各个列。 我用你的代码尝试了它,但它没有做到这一点。我明白你要做的事情。但是,如果我这样插入它,它将使用当前工作表,即Source,而数据需要在工作表Delta中。

设置范围时,我也包含了工作表功能,它就像魅力一样:

max_clause_count

数组中只有一些空行,但我可以自己管理它。 :)谢谢!