Как настроить сортировку и добавление ячеек?

#excel #vba

#excel #vba

Вопрос:

У меня есть лист Excel с сотнями записей. Столбец «C» содержит имя этой конкретной учетной записи. В столбце «D» указана сумма, которая должна быть применена к этой учетной записи. * примечание. столбец «C» может иметь повторяющиеся значения.

Столбец «M» содержит список всех возможных имен, которые могут появиться в столбце «C», а столбец «N» имеет номер 1-???? в порядке, по которому эти элементы должны быть сгруппированы после добавления в лист2.

Пример:

 Column C Column D                 Column M   Column N
John      $500                    John       1 
Jane     -$600                    Jane       2 
Jack      $250                    Jack       3
Jane      $45.00                  Joe        4
Joe                               Jay        5
Jack      $0.00                   Jayson     6
Jay       $85                     Jill       7
  

На листе 2 приведенные выше данные должны быть упорядочены по столбцу «N» и добавлены

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

1. Вы сами пробовали это делать? Если да, не могли бы вы опубликовать код, который у вас уже есть?

2. Пожалуйста, дополнительный код?

Ответ №1:

Мне кажется, что это сводная таблица. Нумерация в первом столбце — это просто цепочка данных «ЕСЛИ» — источником сводной таблицы является: Tabelle1! $ B $ 4: $ D $ 10 введите описание изображения здесь

например, B5: =IF(C5=$F$5;$G$5;IF(C5=$F$6;$G$6;IF(C5=$F$7;$G$7;IF(C5=$F$8;$G$8;IF(C5=$F$9;$G$9;IF(C5=$F$10;$G$10;IF(C5=$F$11;$G$11;"")))))))

Ответ №2:

вы можете попробовать этот (прокомментированный) код:

 Option Explicit

Sub main()
    Dim cell As Range, namesRng As Range, dataRng As Range

    With Worksheets("Sheet1") '<-- reference "Sheet1" (change "Sheet1" to your actual data sheet name)
        Set dataRng = .Range("C1", .Cells(.Rows.Count, "C").End(xlUp)).Resize(, 2) '<--| set the data range from cell "C1" to column "D" cell in column "C" last non empty row
        With .Range("M1", .Cells(.Rows.Count, "M").End(xlUp)).Resize(, 2)  '<-- reference names/order range from cell "M1" to column "N" cell in column "M" last non empty row
            .Sort key1:=.Range("B1"), order1:=xlAscending, Header:=xlNo '<-- sort names in column "M" by column "N" order number
            Set namesRng = .Columns(1).Cells '<-- set ordered names range
        End With
    End With

    With Worksheets("Sheet2") '<-- reference "Sheet2" (change "Sheet2" to your actual output sheet name)
        For Each cell In namesRng '<-- loop through ordered name range
            .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 2).Value = Array(cell.Value, WorksheetFunction.SumIf(dataRng.Columns(1), cell.Value, dataRng.Columns(2))) '<--| write current name in Sheet2 column "A" current empty cell after last not empty one, and corresponding sum in adjacent cell
        Next cell
    End With
End Sub
  

если имена в столбце «M» всегда уже упорядочены правильно, тогда нет необходимости сортировать их по столбцу «N», и код немного упрощается до:

 Option Explicit

Sub main()
    Dim cell As Range, namesRng As Range, dataRng As Range

    With Worksheets("Sheet1") '<-- reference "Sheet1" (change "Sheet1" to your actual data sheet name)
        Set dataRng = .Range("C1", .Cells(.Rows.Count, "C").End(xlUp)).Resize(, 2) '<--| set the data range from cell "C1" to column "D" cell in column "C" last non empty row
        Set namesRng = .Range("M1", .Cells(.Rows.Count, "M").End(xlUp)) '<-- set ordered names range
    End With

    With Worksheets("Sheet2") '<-- reference "Sheet2" (change "Sheet2" to your actual output sheet name)
        For Each cell In namesRng '<-- loop through ordered name range
            .Cells(.Rows.Count, 1).End(xlUp).Offset(1).Resize(, 2).Value = Array(cell.Value, WorksheetFunction.SumIf(dataRng.Columns(1), cell.Value, dataRng.Columns(2))) '<--| write current name in Sheet2 column "A" current empty cell after last not empty one, and corresponding sum in adjacent cell
        Next cell
    End With
End Sub