1

Это то, что я хочу.

Это то что я хочу

Объединить дубликаты из столбца А
Извлечь идентификаторы из столбца B
Суммарные значения из столбца C

Sub SkuSorter()

Dim x As Long, y As Long
Dim rng As Range
Dim wSrc As Worksheet: Set wSrc = Sheets("AR Received SKU's List 1")

With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
End With

With wSrc
    x = .Range("A" & .Rows.Count).End(xlUp).Row
    Set rng = .Range("A1:A" & x)
    y = .Cells(1, .Columns.Count).End(xlToLeft).Column + 2
    rng.AdvancedFilter Action:=xlFilterCopy, copytoRange:=.Cells(1, y), unique:=True
    Z = .Cells(.Rows.Count, y).End(xlUp).Row
    y = y + 1
    .Cells(1, y).Value = "Total"
    .Range(.Cells(2, y), .Cells(Z, y)).Formula = _
        "=SUMIF(" & rng.Address & "," & .Cells(2, y - 1).Address(False, False) & "," & rng.Offset(, 1).Address & ")"
End With

With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With

End Sub

1 ответ1

1

Надеюсь, вы посмотрите здесь снова.
Я дам ответ, где VBA не требуется, и я постараюсь объяснить все до мелочей.

Используя картинку, которой вы поделились, я создал собственный лист:

Мы начинаем с F2 который является самым верхним элементом. Просто =A2 сделает это.
Здесь нечего объяснять.

На G2 появляется =IF(LEN(F2),INDEX(B:B,MATCH(F2,A:A,0)),"") . Зная, что второй столбец всегда будет одинаковым с первым, он просто ищет точное соответствие F2 в диапазоне A:A (MATCH) и печатает все, что находится в B:B в той же строке. (Он останавливается на первом найденном предмете, хотя это и не имеет значения, потому что он всегда такой же). LEN запрещает показ #NA если строка поиска пуста, а также пропускает вычисление всего массива.

В H2 приходит то, что вы предложили =IF(LEN(F2),SUMIF(A:A,F2,C:C),"") . Он просто суммирует все значения в столбце C которые имеют заданный критерий поиска в столбце A LEN такая же, как и в G2 но она не показывает ошибку, она выдает 0 . Тем не менее, вы все равно получите ноль, если есть термин, и сумма равна 0 .

Хотя вы можете просто заполнить G2 и H2 столько, сколько вам нужно, для F2 это не сработает. Но вы можете сделать это с помощью следующей формулы в F3:

=IF(LEN(F2),IFERROR(INDEX(A:A,MATCH(1,(COUNTIF(F$2:F2,A$2:A$1000)=0)*(A$2:A$1000<>""),0)+1),""),"")

Это формула массива, которая должна быть подтверждена с помощью Ctrl+Shift+Enter.

Он начинается с COUNTIF который просто возвращает двоичный массив, в то время как каждый элемент получает 1 если он соответствует какой-либо строке поиска, все остальные получают 0 (поиск всех строк над собой F$2:F2). Поскольку мы не хотим получать уже использованный предмет, мы обращаем все 0 TRUE (=0). Нам также не нужен empty элемент, поэтому мы тоже проверяем его (A$2:A$1000<>""). Умножение двух логических массивов аналогично наличию AND для каждой пары элементов, а при использовании действительного AND проверяется, что все элементы в обоих массивах имеют значение TRUE . Однако, умножение снова дает нам двоичный массив, имеющий 1 на каждый элемент, который не является пустым и не используется. MATCH теперь проверяет первую 1 и возвращает ее номер позиции (строка). Но начиная со второго ряда мы получаем смещение, которое обнуляется с +1 . Имея позицию, INDEX дает нам строку, которая нам нужна. IFERROR только для первого empty решения, которое вернуло бы #NA . И LEN просто пропускает вычисления для всех ячеек после первой пустой.
Использование мастера формул для просмотра того, что он действительно вычисляет, также помогает понять. Но всегда перепроверяйте все $ иначе автозаполнение может закончиться неудачей.

Если вам все еще нужно что-то спросить, просто напишите комментарий. :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .