您好我在excel中有以下数据集。每个产品结束后,总数将在下一行中给出,并且' *"标志将出现在' total'之前。行。
Product Type Cost
A 1 10
A 1 20
A 2 10
A 1 20
* A 60
B 1 30
B 7 10
B 7 30
B 4 50
* B 120
C 3 10
C 4 50
C 4 30
C 4 25
C 4 20
C 4 15
C 3 10
C 4 5
* C 165
我想获得每种产品的每种TYPE的MODE。以及每个产品的总成本。如果它们可以按产品名称列出,那就最好了。
例如,输出应为
A 1 60
B 7 120
C 4 165
我怎样才能做到这一点?使用excel公式或VBA都可以。 请帮忙。 谢谢......
答案 0 :(得分:0)
假设您提供的源表位于A1:D20
(第1行中的标题,并且A列仅包含星号(*)),并且您提供的结果表位于{{ 1}},然后:
在F2:H4
,数组公式** :
G2
编辑:根据您的评论,如果 Type 列可能包含非数字:
=MODE(IF(B$2:B$20=F2,{1,1}*C$2:C$20))
在=INDEX(C$2:C$20,MODE(IF(B$2:B$20=F2,IF(C$2:C$20<>"",MATCH(C$2:C$20,C$2:C$20,{0,0})))))
:
H2
根据需要将两者都复制下来。
请注意,如果多个值共享最高频率(即技术上没有单个模态值),那么,在这些值中,将返回找到的第一个值。
此致
**数组公式的输入方式与“标准”公式的输入方式不同。您只需按住CTRL和SHIFT键,然后按ENTER键,而不是按ENTER键。如果你已经正确地完成了它,你会注意到Excel在公式周围放置了大括号{}(虽然不要尝试自己手动插入这些)。
答案 1 :(得分:0)
鉴于您的数据“结构”,可能的VBA方法可能如下:
Option Explicit
Sub main()
Dim cell As Range, firstCell As Range
Dim iProduct As Long
With Worksheets("Dataset") '<--| change "Dataset" with your actual worksheet name
Set firstCell = .Range("A2") '<--| set first cell for the current "Product" range
For Each cell In .Columns(1).SpecialCells(XlCellType.xlCellTypeConstants).Offset(, 2) '<--| loop through "asterisks" in column "A"
iProduct = iProduct + 1 '<--| update "Product" counter
.Range("F1:H1").Offset(iProduct) = Array(cell.Offset(, -1).Value, _
Application.WorksheetFunction.Mode(Range(firstCell, cell).Value), _
cell.Offset(, 1).Value)
Set firstCell = cell.Offset(1) '<--| set first cell for the next "Product" range
Next cell
End With
End Sub
我假设: - 数据在“A:D”列中,“A”列中有“星号” - 从第1行向下输出“F:H”