VBA循环计算逻辑错误

时间:2014-09-05 15:06:53

标签: vba excel-vba foreach excel

我正在尝试创建一个VBA宏来计算每日结算用于会计目的。 所以解释一下背景。我首先下载一个包含以下格式数据的语句

E.g。

Memo FileId amt

  • Total File1 amt
  • A File1 amt
  • B File1 amt
  • C File1 amt
  • D File1 amt
  • Total File2 amt
  • C File2 amt
  • D File1 amt

A + B + C必须考虑总数而且它们不一定都在那里(例如,可能只有B或C)

现在我想计算每个fileid的每个B,C和D的值(这是唯一的) 然后删除这些行并创建一行,其中包括B和C上的总和作为金额。

我在这里开始使用以下逻辑循环。我知道这会导致无限循环,但我无法解决此问题。

For Each ACell In rng
        Do While (ACell.Offset(0, 1).Value = ACell.Offset(1, 1).Value) 'here my intention is to check all the files in the range not just the one below.

        If (ACell.Value = "B") Then
            tempCalc = tempCalc + ACell.Offset(0, 2).Value
            ACell.EntireRow.Delete
        ElseIf (ACell.Value = "C") Then
            tempCalc = tempCalc + ACell.Offset(0, 2).Value
            ACell.EntireRow.Delete
        ElseIf (ACell.Value = "D") Then
            tempCalc = tempCalc + ACell.Offset(0, 2).Value
            ACell.EntireRow.Delete
        End If
        ACell.Offset(1, 0).EntireRow.Insert
        ACell.Offset(1, 0).Value = "Summed B C D"
        ACell.Offset(1, 2).Value = tempCalc
        tempCalc = 0
    Loop
Next ACell

您能否在此提出任何可能的逻辑错误建议?

1 个答案:

答案 0 :(得分:1)

我在阅读你的代码时遇到了可怕的时间。因此,首先提出一些有希望使问题脱颖而出的建议。

  • 不要隐含地迭代Range。默认情况下,这将迭代rng.Cells但看起来你真的想迭代第一列的单元格。
  • 不要像这样迭代细胞。对于您正在迭代的每个项目,您的操作应该是统一的。改为使用行索引。
  • 不要使用cell.Offset。我从未找到过有用的实现方法。声明Const,指定列索引Const FILE_ID_COL As String = "B"等。
  • 如果每次使用相同的子句,请使用AND运算符来链接谓词而不是ElseIf

问题

  • 您正在迭代的范围中插入行。你想迭代插入的行吗?
  • 您正在插入总和行,而文件ID 仍然相同。也许你应该把它移到while循环之外?

也许这就是你的意思?

While row_index < row_count

    tempCalc = 0

    While (rng.cells(row_index, FILE_ID_COL).Value _
           = rng.cells(row_index + 1, FILE_ID_COL).Value) 

       If rng.cells(row_index, MEMO_COL).Value <> "Total" Then
           tempCalc = tempCalc +  rng.cells(row_index, AMNT_COL).Value 
           ACell.EntireRow.Delete
       EndIf

       row_index = row_index + 1

    Wend

    rng.rows(row_index).Insert shift:=xlDown
    rng.cells(row_index, MEMO_COL).Value = "Summed B C D"
    rng.cells(row_index, AMNT_COL).Value = tempCalc
    row_index = row_index + 1 

Wend