Excel中不用VBA也能实现:去掉重复数据,生成下拉菜单

钦泽练八段锦 2024-05-29 18:24:45

需要实现这么一个功能,针对一张部门、岗位表,要取出部门名称,做成下拉菜单。

图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原始表)

0 阅读:0