我编写了这个VBA代码,它通过一组数据并将特定的数据行对齐在一起并删除其余的数据。我有各种标记如下的列。每当“结算”出现在“M
”列下时,我的程序会在“B
”下记录与该行关联的订单号。然后循环,当“B
”下的订单号一致时,它会移动与“已完成”相关联的“L
”下的备注,并将其复制到列之外,并在“已结算”的位置下复制被找到。此外,当它还将“D
”列下的日期移动到与该相同订单号相关联的“已确认”时,再次添加到“已结算”行旁边的列中。我遇到的问题是这些行中没有一行以相同的顺序出现,也可能有重复。如果存在类似“已确认”的第二个订单号中的副本,那么最近的一个将被拍摄并复制到“已结算”旁边。任何帮助将非常感谢!非常感谢提前。这是一个例子: -
B D L M
1.467334 4/22/2015 Confirmed
2.467334 4/17/2015 YES Tech swapped out the MGR 13, tested Completed
3.467334 4/20/2015 4/16 Maint. Billed Billed
4.537551 4/15/2015 Confirmed
5.537551 4/14/2015 YES Tech swapped out the MGR 13, tested Confirmed
6.537551 4/08/2015 4/16 Maint. Billed Billed
7.537551 4/14/2015 YES Tech swapped out equipment Completed
8.537551 4/08/2015 4/16 Maint. equip. Confirmed
必需输出: -
B D L M Q R
3.467334 4/20/2015 4/16 Maint. Billed Billed YES swapped out theMGR 13, tested 4/22/2015
6.537551 4/16/2015 4/16 Maint. Billed Billed YES Tech swapped out equipment 4/14/2015
这是我的代码:
Sub Test()
Dim LR As Long
Dim Rng As Range
Dim i As Long
Dim r As Long
Dim com As Range
LR = Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To LR Step 1
''''This might be confusing but what I am doing here is copying the notes for the "Billed" row and moving to the right.
'This part works fine but the rest of the "Do While" loop doesn't.
If Cells(i, "M").Value = "Billed" Then
Cells(i, "Q").Value = Cells(i, 12).Value
Set com = Cells(i, "B")
Set num = Cells(i, "B").Row
Do While Cells(i, "B").Value = com
If Cells(i, "M") = "Completed" Then
Cells(num, "R").Value = Cells(i, 12).Value
End If
Loop
Do While Cells(i, "B").Value = com
If Cells(i, "M") = "Confirmed" Then
Cells(num, "S").Value = Cells(i, 4).Value
End If
Loop
End If
Next i
答案 0 :(得分:0)
您的问题在这里:
Do While Cells(i, "B").Value = com
If Cells(i, "M") = "Completed" Then
Cells(num, "R").Value = Cells(i, 12).Value
End If
Loop
Do While Cells(i, "B").Value = com
将永远为真,因为i
和com
都不会在循环中发生变化。在某种形式上,您需要调整该循环中这两个变量之一的值。 我相信一个简单的 i = i + 1
会做你以后的事情,就像这样:
Do While Cells(i, "B").Value = com
If Cells(i, "M") = "Completed" Then
Cells(num, "R").Value = Cells(i, 12).Value
End If
i = i + 1
Loop
击> <击> 撞击>
刚刚意识到自己不会工作,因为i
是For...Next
循环中的计数器。相反,试试这个:
r = i
Do While Cells(r, "B").Value = com
If Cells(r, "M") = "Completed" Then
Cells(num, "R").Value = Cells(r, 12).Value
End If
r = r + 1
Loop
您已宣布r
,但从未使用过它,因此我将其用于此循环。
您的下一个Do While...Loop
区块也是如此。
另外一些想法:
Cells(i, "M")
和Cells(i, 12)
之间混合参考。虽然编译器并不关心并且可以很容易地解释这一点,但是对于我们人类类型来说,确定哪个列被引用是更难的 - 第{12}个字是M
?不,它是第13个,所以这意味着......哦,列L
!1.
,2.
等指示行号而不是十进制值。如果是这种情况,我建议让您的代码按照有意义的顺序对数据进行排序,然后按照排序顺序编写代码。这样,您可以明确地处理重复值 - 例如,如果OrderNum(row) = OrderNum(row-1) then
并检查日期以获取最新值。