#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