VBA从数组中填充范围

我创build了一个满足条件的数组,这个数组到目前为止都非常好。 现在符合条件的值需要被复制到不同的工作表中。

其实我不得不提出一些问题: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 

我一直在网上找了两天,包括cpearson。 在这篇关于数组大小的文章(在底部),它指出#N / A。 这是我所拥有的! 但不要。 🙂

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

我希望有一个人可以帮助我。

一些build议补充说,不知道这是否是你需要的。

 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。 如果在表格(“SE16N”)中find单元格(i,“A”),则不会进入for循环。 因此,myArray将始终捕获不在表格中的值(“SE16N”)。 添加一个NOT运算符后,只能find能够加载到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]是的,如果价值不存在,就需要做点什么。 所以我没有改变这个部分。 [2]我想我仍然需要阅读更多有关数组,因为这不是100%清楚。 [3]真棒。 不知道这是可能的。

是的,数组中的列需要去个别列。 我试着用你的代码,但它并没有做到这一点。 我明白你想要做什么。 但是,如果我这样插入,它将使用当前工作表,即Source,而数据需要在工作表Delta中。

当设置范围我也包括工作表function,它的作品像魅力:

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

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