我正在尝试创建一个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
您能否在此提出任何可能的逻辑错误建议?
答案 0 :(得分:1)
我在阅读你的代码时遇到了可怕的时间。因此,首先提出一些有希望使问题脱颖而出的建议。
Range
。默认情况下,这将迭代rng.Cells
但看起来你真的想迭代第一列的单元格。cell.Offset
。我从未找到过有用的实现方法。声明Const
,指定列索引Const FILE_ID_COL As String = "B"
等。AND
运算符来链接谓词而不是ElseIf
。也许这就是你的意思?
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