VBA, нужна условная сумма, основанная на изменении в другом столбце

#vba #excel

#vba #excel

Вопрос:

Новичок в VBA. Попытка просмотреть список уникальных идентификаторов и промежуточных итоговых значений, связанных с каждым идентификатором.

После этого эта общая сумма должна быть отображена в другом столбце в первой строке.

Соображения:

  • Поскольку он находит новый идентификатор, промежуточный итог должен начинаться заново и только промежуточный итог блока значений, связанных с ним.
  • Каждый промежуточный итог должен отображаться только один раз рядом с первым экземпляром уникального идентификатора в списке.
  • каждый новый лист будет содержать не менее 5 тыс. строк, и данные будут содержаться в одних и тех же столбцах. Много данных.
  • Столбцы в моем листе на самом деле физически не расположены рядом друг с другом, а находятся на одном листе.
  • при каждой печати идентификатор custid будет меняться в другой строке. Ему нужно перебрать идентификаторы, найти изменение и суммировать значения только для этого custid. После этого эта общая сумма должна быть отображена в другом столбце в первой строке.

Это некоторые базовые примерные данные:

Totl Subttl CustID Amt.

         123456  55.74
        123456  61.47
        223456  44.53
        223456  142.11
        223456  -142.11
        333456  44.53
        333456  52.89
        333456  118.37
        333456  354.80
        443456  6.49
        443456  44.53
        443456  162.74
 

К этому:

Totl Subttl CustID Amt.

 946.09      117.21  123456  55.74
                    123456  61.47
            44.53   223456  44.53
                    223456  142.11
                    223456  -142.11
            570.59  333456  44.53
                    333456  52.89
                    333456  118.37
                    333456  354.80
            213.76  443456  6.49
                    443456  44.53
                    443456  162.74
 

Ответ №1:

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

РЕДАКТИРОВАТЬ Я обновил код, чтобы сначала включить сортировку. Он также копирует ее на второй лист (Лист2), чтобы вы не потеряли исходный список данных в случае, если что-то пойдет не так.

РЕДАКТИРОВАТЬ 2 Просто подумал, если вы делаете это на больших наборах данных, тогда вам нужно отключить обновление экрана, чтобы ускорить процесс

 Sub sumAndFormat()

Dim lastRow As Long
Dim activeRow As Long
Dim uniqueID As Long
Dim totalSum As Currency
Dim subRow As Long
Dim subTotal As Currency

Application.ScreenUpdating = False

ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("A1"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet1").Sort
        .SetRange Range("A1:B12")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

lastRow = Sheets("sheet1").Cells(Sheets("sheet1").Rows.Count, "A").End(xlUp).row


totalSum = 0
subTotal = 0
subRow = 1

uniqueID = Sheets("Sheet1").Cells(1, 1).value

For i = 1 To lastRow

    totalSum = totalSum   Sheets("Sheet1").Cells(i, 2).value

    If uniqueID = Sheets("Sheet1").Cells(i, 1) Then
        subTotal = subTotal   Sheets("Sheet1").Cells(i, 2).value
        Sheets("Sheet2").Cells(subRow, 2).value = subTotal
        MsgBox (subTotal)
    Else
        uniqueID = Sheets("Sheet1").Cells(i, 1).value
        subTotal = Sheets("Sheet1").Cells(i, 2).value
        subRow = i
    End If



    Sheets("Sheet2").Cells(i, 3).value = Sheets("Sheet1").Cells(i, 1).value
    Sheets("Sheet2").Cells(i, 4).value = Sheets("Sheet1").Cells(i, 2).value

Next i

Sheets("Sheet2").Cells(1, 1).value = totalSum

Application.ScreenUpdating = True

End Sub
 

Комментарии:

1. На самом деле это почти идеально подходит для моего приложения, спасибо. Это то, что я в итоге использовал. Просто и эффективно. Спасибо за лакомый кусочек обновления экрана. Очень полезно. Помимо этого, у меня есть около двух страниц кода VBA, и все это работает с этими 5 тысячами строк, так что включение обновления превратилось в огромную помощь!