我正在尝试编写For循环以对增量列求和并检查总值。
如果总和列G + H + I + ..(最后一列)<然后,列AG将列G,H,I,...更新为0
如果列的总和>列AG然后是求和中使用的最后一个活动列=所有列的总和减去列AG。 请参考图片,以黄色突出显示的单元格显示预期的宏。
为了使宏运行得更快,主代码以嵌套的If编写 当Column AG> 0运行主代码
Sub Test()
Application.ScreenUpdating = False
Set dm = Worksheets("a")
Set CTOT = dm.Columns("AG")
dm.Activate
lastcol = dm.Cells(1, Columns.Count).End(xlToLeft).Column
fz = dm.Range("C" & Rows.Count).End(xlUp).Row
For i = 3 To fz
inventory = CTOT.Cells(i, 1).Value
If inventory > 0 Then
For j = 7 To lastcol
sumdm = Application.WorksheetFunction.Sum(dm.Range(Cells(i, j), Cells(i, j + 1)))
If sumdm < inventory Then
dm.Cells(i, j).Value = 0
Else
dm.Cells(i, j).Value = sumdm - inventory
End If
Next j
End If
Next i
Application.ScreenUpdating = True
End Sub
我几乎陷入困境,但我现在的代码似乎给了我非常奇怪的数据。 我想这可能是因为我正在同时更新并运行循环,但不确定如何解决这个或更好的方法来编写代码。
答案 0 :(得分:1)
你可以通过这样的读写来加速你的代码
Dim data As Variant
' read data from sheet
data = Sheets("a").Range("A1: D100").value
' read/write value to data(i,j)
' smt.....
' then write to sheet
Sheets("a").Range("A1: D100") = data
我认为你太懒了,无法正确设置你的数据类型。这不是Python好吗?
Sub Test()
Application.ScreenUpdating = False
Set dm = Worksheets("a")
Set CTOT = dm.Columns("AG")
Dim inventory, sumdm As Double
dm.Activate
lastcol = dm.Cells(1, Columns.Count).End(xlToLeft).Column
fz = dm.Range("G" & Rows.Count).End(xlUp).Row
Dim data, ivn As Variant
data = dm.Range(dm.Cells(3, 7), dm.Cells(fz, lastcol))
ivn = dm.Range("AG3:AG" & fz)
For i = LBound(data, 1) To UBound(data, 1)
inventory = CLng(ivn(i, 1))
If inventory > 0 Then
sumdm = 0
For j = LBound(data, 2) To UBound(data, 2)
sumdm = sumdm + data(i, j)
If sumdm < inventory Then
data(i, j) = 0
Else
data(i, j) = sumdm - inventory
Exit For
End If
Next j
End If
Next i
dm.Range(dm.Cells(3, 7), dm.Cells(fz, lastcol)) = data
Application.ScreenUpdating = True
End Sub