我创建了一个在满足条件时填充的数组 - 到目前为止一直很好。 现在,满足条件的值需要复制到另一个工作表。
其实我还有问题: 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.这就是我所拥有的!但是不要。 : - )
我觉得我不是那么遥远,如果它只是一个相对较小的东西就不会感到惊讶。
我希望有人可以帮助我。
答案 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
数组中只有一些空行,但我可以自己管理它。 :)谢谢!