问题来源
如下两个表格:
今天韩老师给出函数法与VBA法。
函数方法
相同姓名有序排列:
1、在A2单元格输入编号1;
2、在A3单元格输入公式:
=IF(B3=B2,A2,A2+1)
该公式的含义是:
如果B3和B2姓名相同,则填写B2对应的编号A2,否则A2+1;
相同姓名凌乱无序排列:
其实在真正工作中,有序排列的姓名不多,更多的是无序排列。
1、在F2中输入公式:
=IFERROR(VLOOKUP(G2,IF({1,0},G$1:G1,F$1:F1),2,0),N(F1)+1)
向下填充,即得结果:
其中:
IF({1,0},G$1:G1,F$1:F1):
是由IF函数重新构建一动态区域,该区域有两列:
第一列是姓名,起始单元格是G1,结束单元格随公式向下填充而扩展;
第二列是编号,起始单元格是F1,结束单元格随公式向下填充而扩展;
公式不管填充到哪一行,该动态区域的结束行都是当前公式所在行的上一行。
VLOOKUP(G2,IF({1,0},G$1:G1,F$1:F1),2,0):
IFERROR(VLOOKUP(G2,IF({1,0},G$1:G1,F$1:F1),2,0),N(F1)+1):
公式向下填充,如果到第12行,则:查找姓名G12对应的编号出错,则返回N(F11)+1。
N函数:
语法:N(VALUE);
功能:将不是数值的值转换为数值形式;
不同参数VALUE,对应的返回值:
本示例中,N(F1)的返回值是0。
注:无序排列的公式同样适合有序排列!
VBA法
代码为:
Sub 编号()
Dim a As Object, i As Long "创建字典/
Set a = CreateObject("scripting.dictionary")
For i = 2 To Range("b1").CurrentRegion.Rows.Count
If Not a.exists(Cells(i, 2).Value) Then "添加编号到字典,第一个编号不存在),则
k = k + 1 "计数
a(Cells(i, 2).Value) = k "给字典key编号,第一个编号是1,第二个编号是2......
Cells(i, 1) = k "返回给第一列,分组
Else "如果字典(编号)存在
Cells(i, 1) = a(Cells(i, 2).Value) "直接在字典里查询编号
End If
Next
End Sub
用法:
本篇成文,特别感谢微信好友✎﹏ℳ๓₯㎕提供思路!