2015-05-31 6 views
0

У меня есть столбец целых чисел, отсортированный по восходящей последовательности сверху вниз. Каждое целое число появляется несколько раз в столбце, но целое число не появляется одинаковое количество раз.Как суммировать переменное число строк в столбце?

Перемещение вниз по столбцу, когда целое число изменяется, я хочу вставить строку, которая показывает сумму идентичных целых чисел над новой строкой.

Поскольку я перемещаюсь по столбцу, я использую счетчик для подсчета одинаковых целых чисел (и мое тестирование показывает, что счетчик работает), , но когда я вставляю счетчик в формат R1C1 (третья строка снизу внизу), он возвращает нуль. Поэтому итоговое суммирование суммирует текущую строку с одной над ней (круговая ссылка), а не верхняя строка, содержащая целое число, равное единице над ним.

Мой код:

Private Sub CommandButton1_Click() 
Dim Counter As Integer 
Counter = -1 
Range("F5").Activate 
For i = 1 To 50 
x = ActiveCell(1, 1).Value 
y = ActiveCell(2, 1).Value 
    If x = y Then 
    ActiveCell.Offset(1, 0).Select 
    Counter = Counter - 1 
    Else 
    Call subTotal 
    Counter = -1 
    End If 
Next i 
End Sub 

Sub subTotal() 
ActiveCell.Offset(1, 0).Select 
ActiveCell.EntireRow.Insert 
ActiveCell.FormulaR1C1 = "=SUM(R[" & Counter & "]C:R[-1]C)" 
ActiveCell.Offset(1, 0).Select 
End Sub 
+0

Сводные таблицы и подвыборники могут сделать это без необходимости в VBA - просто мысль. – zedfoxus

ответ

0

Вот решение (вроде условного «Бегущая Сумма»), которые вы можете использовать/изменить отношение к вашему делу. Полагая для простоты, что все 10 значений в колонке А Excel Worksheet, то «Running Count» появится в колонке B и «Running Sum» в колонке C:

1 3 3 
1 2 2 
4 3 12 
1 1 1 
2 2 4 
4 2 8 
5 2 10 
4 1 4 
2 1 2 
5 1 5 

Ниже приведен простой VBA фрагмент кода что делает работу:

Private Sub CommandButton1_Click() 
Dim Counter As Integer 
Dim lastRow As Integer 
lastRow = Cells(Rows.Count, "A").End(xlUp).Row 
For i = 1 To lastRow 
    Counter = 0 
    x = Cells(i, 1).Value 
    For j = i To lastRow 
     If x = Cells(j, 1).Value Then 
      Counter = Counter + 1 
      Cells(i, 2).Value = Counter 
      Cells(i, 3).Value = Counter * x 
     End If 
    Next j 
Next i 
End Sub 

Кроме того, универсальным решение для любого количества записей показано ниже:

Private Sub CommandButton1_Click() 
Dim Counter As Integer 
Dim lastRow As Integer 
lastRow = Cells(Rows.Count, "A").End(xlUp).Row 
For i = 1 To lastRow 
    Counter = 0 
    x = Cells(i, 1).Value 
    For j = i To lastRow 
     If x = Cells(j, 1).Value Then 
      Counter = Counter + 1 
      Cells(i, 2).Value = Counter 
      Cells(i, 3).Value = Counter * x 
     End If 
    Next j 
Next i 
End Sub 

Надеется, что это может помочь. С уважением,

0

Я обнаружил, что мне нужно передать переменную, называемую «counter», подпрограмме под названием «subTotal». Как только я исправил это, все сработало нормально.

Смежные вопросы