Excel VBA增量列求和和更新

时间:2017-08-03 04:03:53

标签: excel excel-vba vba

我正在尝试编写For循环以对增量列求和并检查总值。

如果总和列G + H + I + ..(最后一列)<然后,列AG将列G,H,I,...更新为0

如果列的总和>列AG然后是求和中使用的最后一个活动列=所有列的总和减去列AG。 请参考图片,以黄色突出显示的单元格显示预期的宏。

为了使宏运行得更快,主代码以嵌套的If编写 当Column AG> 0运行主代码

Picture 1 Picture 2

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

我几乎陷入困境,但我现在的代码似乎给了我非常奇怪的数据。 我想这可能是因为我正在同时更新并运行循环,但不确定如何解决这个或更好的方法来编写代码。

1 个答案:

答案 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