需要实现这么一个功能,针对一张部门、岗位表,要取出部门名称,做成下拉菜单。
图1:需要去掉重复数据
可以看到,在这张表中“部门”这一列的数据有许多重复,如果直接取这一列的数据作为下拉菜单,也不是不能用,但估计用的人都会很纠结。如果嫌VBA编程太麻烦,有没有什么办法能实现呢?
尝试1:简单去重
可以用一个很简单的公式:
=IF(B3=B2,"",B3)
就能去掉部门中的重复信息。
图2:简单去重
经过处理的“E列”尽管去掉了重复数据,但也留下了很多空白,如果我们直接调用图中的“E列”作为下拉菜单的话,这些空白会原封不动地保留,显然不好用。
尝试2:字符串拼接
我们可以将“E列”的数据拼接成字符串,然后就能去掉空白数据,从而取出几个部门的数据。但在拼接前,需要增加分隔符,以便于字符串操作。
图3:增加分隔符
1、要增加分隔符很简单,在“E列”基础上使用公式:
=IF(E3<>"",E3,IF(AND(E3="",E4=""),"",IF(AND(E3="",E4<>""),",")))
就得到了“F列”。
2、接下来是拼接,在excel中有一个函数PHONETIC可以很方便地将一列数据快速拼接起来,公式如下:
=PHONETIC(B3:B12)
然而很不幸的是,该函数对于由公式生成的单元格无效。
3、可以采用以下公式:
=CONCATENATE(E3,E4,E5,E6,E7,E8,E9,E10,E11,E12)
当然也可以用更简单的公式:
=E3&E4&E5&E6&E7&E8&E9&E10&E11&E12
4、其实还有一种方法,可以不用生成“F列”,而直接在“E列”基础上生成:
=TEXTJOIN(",",TRUE,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12)
5、这样我们就得到了字符串“财务部,销售部,综合部”,有很多方法可以将其中的三个部门数据分割出来,把他们排在一列(挨在一起),就能作为下来菜单的数据源了。
完美方案:序号法
接下来就要隆重介绍完美方案,见下图。
图4:完美方案
1、首先给“B列”的数据编上序号,得到“E列”。
2、由于“E列”的序号未区分重复的数据,因此我们需要对序号进行去重,用以下公式:
=IF(B3<>B2,F2+1,F2)
需要注意的是,F2要填入“0”,作为序号的初始值。
这样就实现了序号与部门数据的一一对应,即部门相同则序号也相同。
3、接下来就可以根据去重后的序号,得到去重的部门数据,公式如下:
=INDEX(B:B,MATCH(E3,F:F,0))
其中MATCH函数用于查找从1开始的序号在“F列”中的位置,INDEX函数用于从“B列”选取对应的部门数据。
不过用这个公式从G6开始会报错,可以改造一下:
=IF(ISNA(MATCH(E3,F:F,0)),"",INDEX(B:B,MATCH(E3,F:F,0)))
即如果是无效信息,则填入空白数据。
设置下拉菜单
至此,部门数据中的重复数据就被去掉了,而且剩余的数据挨在一起显示。
1、接下来就可以设置下拉菜单了,考虑到原始数据有可能再有增加,也就是说“B列”、“C列”会增加行,为了让下拉菜单能够适应,可以将下拉菜单的来源设为:
=$G:$G
图5:设置下拉菜单
这样无论原始数据增加多少,下拉菜单都能够及时捕捉到了。但这样操作也带来一个问题,就是最后一个数据的下面会有大量空白行,需要在下拉菜单的来源中“加点料”。
图6:增加统计数据H列
2、我们需要自动数出“G列”中有效数据的个数,但COUNTA函数会把空白数据“”也纳入统计,COUNT函数则不识别字符串。我们需要增加“H列”,将“G列”中有效数据识别为数字,然后再用COUNT函数就能统计出“H列”的个数了,而这就是部门的个数。
3、我们再将下拉菜单的来源改造一下:
=OFFSET(G3,,,COUNT(岗位列表H:H))
就能去掉下拉菜单中的空白行了。
完美!
更多应用
本文介绍的方法还有许多其他用途,这里再介绍一种。
图7:商品合并统计
图中左半部分是原始销售列表,同样的商品在不同日期都有销售,我们可以处理成图中右半部分的数据,这就实现了商品合并统计。
实际应用中我们可以将灰色的两个辅助列隐藏,就不会影响使用了。
需要更多实用教程,请关注“四句话管理”。
(关注我后发私信“去重工具”,可获得文中用到的excel原始表)