程序冻结而不工作

时间:2015-04-27 15:47:24

标签: vba excel-vba excel

我编写了这个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

1 个答案:

答案 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将永远为真,因为icom都不会在循环中发生变化。在某种形式上,您需要调整该循环中这两个变量之一的值。 我相信一个简单的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

<击>

刚刚意识到自己不会工作,因为iFor...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区块也是如此。

另外一些想法:

  1. 您在Cells(i, "M")Cells(i, 12)之间混合参考。虽然编译器并不关心并且可以很容易地解释这一点,但是对于我们人类类型来说,确定哪个列被引用是更难的 - 第{12}个字是M?不,它是第13个,所以这意味着......哦,列L
  2. 使用一致的块缩进 - 这也使您的代码更容易阅读和精神分析。同样,编译器并不关心,但是您或者在您之后维护代码的人会很感激。
  3. 您提到重复订单号存在问题。我没有看到,除非1.2.等指示行号而不是十进制值。如果是这种情况,我建议让您的代码按照有意义的顺序对数据进行排序,然后按照排序顺序编写代码。这样,您可以明确地处理重复值 - 例如,如果OrderNum(row) = OrderNum(row-1) then并检查日期以获取最新值。