2015-12-10 2 views
0

У меня есть эта таблица длиной около 50 000 строк, и я бы хотел, чтобы Excel прошел через и присвоил номер или букву.Excel VBA Loop через таблицу и суммарные значения

В основном я пытаюсь группировать строки данных на основе их суммы, превышающей 1 000 000.

Если ячейка А в этой строке меньше 1 000 000, она перейдет к следующей строке и добавит предыдущую ячейку А в текущую и т. Д. Это продолжается до суммы всех строк> = 1,000,000. Когда это происходит, число «назначается» (как указано в конце строк).

Образец данных:

Table example

Вот мой текущий "псевдо" код:

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 

Может кто-то мне точку в в правильном направлении?

ответ

2

С 50 тыс. Строк вы, вероятно, оцените перемещение значений в массив вариантов для обработки, а затем вернете их на рабочий лист ru 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 

Непонятно, как вы хотели закончить последовательность, если последний набор чисел не достиг отметки 1M.

-1

Надеюсь, что я ясно в своих комментариях, дайте мне знать, делает ли код то, что вы хотите.

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 
Смежные вопросы