这就是我要的。
合并 A 列中的重复项
从 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
希望您能再次查看这里。
我将给出不需要 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),"")
所有值相加。-part 与 相同,虽然它不会显示错误,但它会弹出一个。但是,如果存在搜索词并且总和为,您仍将得到零。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
再检查一遍全部$
或自动填充可能会失败。
如果您还需要询问什么,请发表评论。:)