Kaizen
Kaizen

Reputation: 35

Excel VBA Loop through table and sum up values

I have this table about 50,000 rows long that I would like Excel to go through and assign a number or letter.

Basically I am trying to group rows of data based on their sum being greater than 1,000,000.

If cell A in that row is less than 1,000,000 it will go to the next row and add up the previous cell A to the current one, and so on. This continues until the sum of all rows >= 1,000,000. When that happens, a number is "assigned" (as in entered at the end of the rows).

Sample data:

Table example

Here is my current "pseudo" code:

For x = 2 to lastrow
    y = 1

    If Range("A" & x).value < 1000000 Then

'I know something needs to be entered here but I don't know what

        Do while balance < 1000000

            sumbalance = Range("A" & x) + Range("A" & x + 1)

'Until sumbalance >= 1000000 Then Range("A" & x).Offset(0, 2).value = y

     Else

         Range("A" & x).offset(0, 2).value = y + 1 '(?)         

Next x

Can someone point me the in the right direction?

Upvotes: 0

Views: 2851

Answers (2)

manu
manu

Reputation: 942

I hope i am clear in my comments, let me know if the code does what you want.

  Option Explicit

Sub balance()

Dim wb As Workbook
Dim ws As Worksheet
Dim x As Double, y As Integer
Dim lastrow As Long
Dim sumbalance As Double
Dim Reached As Boolean

  Set wb = ThisWorkbook
  Set ws = wb.Sheets("Sheet1") 'Change the name of the sheet to yours

  lastrow = ws.Range("A" & Rows.Count).End(xlUp).Row 'Check the last Row

For x = 2 To lastrow

            y = 1 ' Number 1 will be past in column C when sumblance >= 1'000'000
Reached = False
Do

If Range("A" & x).Value < 10 ^ 6 Then ' Value less than 1'000'000

                    If sumbalance = 0 Then 'Start the sum balance at 0
                            sumbalance = Range("A" & x)

                    Else
                            sumbalance = Range("A" & x) + sumbalance 'We add the previous amount to the new one
                             x = x + 1
                    End If

     Else

     Range("A" & x).Offset(0, 2).Value = y ' If the number is directly >= 1'000'000
     Reached = True
 End If



    Loop Until sumbalance >= 10 ^ 6 Or x = lastrow Or Reached = True

        Range("A" & x).Offset(0, 2).Value = y 'when the Sum Balance is >= 1'000'000 so 1 is paste in column c
        sumbalance = 0 'Reinitialize the balance to 0

        Next x

End Sub

Upvotes: -1

user4039065
user4039065

Reputation:

With 50K rows, you will likely appreciate moving the values into a variant array for processing then returning them to the worksheet en masse.

Dim i As Long, rws As Long, dTTL As Double, v As Long, vVALs As Variant

With Worksheets("Sheet2")
    vVALs = .Range(.Cells(2, "A"), .Cells(.Cells(Rows.Count, "A").End(xlUp).Row, "B")).Value2
    For v = LBound(vVALs, 1) To UBound(vVALs, 1)
        dTTL = dTTL + vVALs(v, 1): rws = rws + 1
        If dTTL >= 10 ^ 6 Then
            For i = v - rws + 1 To v
                vVALs(i, 2) = rws
            Next i
            dTTL = 0: rws = 0
        End If
    Next v
    .Cells(2, "A").Resize(UBound(vVALs, 1), UBound(vVALs, 2)) = vVALs
End With

It isn't clear how you wanted to end the sequence if the last set of numbers do not reach the 1M mark.

Upvotes: 2

Related Questions