吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 446|回复: 14
收起左侧

[经验求助] Excel数据筛选函数求助

[复制链接]
杜蕾斯八五折 发表于 2024-7-25 15:37
30吾爱币
需要从一个有员工姓名及编号的表格中,按姓名筛选部分员工的编号,目前使用的是VLOOKUP。现在存在的问题是,员工中有重名人员,VLOOKUP函数只能筛选重名人员中的第一个人的编号(如表中赵二,我想筛选的是编号为20240709的)。
不知道有什么方法,在有重名的情况下,能够选择重名的员工编号,如在J列相应的表格中添加下拉菜单,从下拉菜单中选择对应人员的编号。万分感谢!
示例附件下载地址
https://wwo.lanzoul.com/il4sQ25hfuje
密码:gowe

最佳答案

查看完整内容

只针对当前区域写了个,扩展动态区域自己扩展一下吧,很简单 [mw_shl_code=vb,true]Sub demo() Dim dic, i%, arr, k$, sr$ Set dic = CreateObject("scripting.dictionary") arr = Range("a2:b13") '这里写死的,需扩展 For i = 2 To 13 '这里写死的,需扩展 k = Range("a" & i).Value dic(k) = Range("b" & i).Value & "," & dic(k) Next Range("i3:i10").Validation.Delete '这里写死的,需扩展 Range(" ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lisongmei 发表于 2024-7-25 15:37
本帖最后由 lisongmei 于 2024-7-25 17:36 编辑
lisongmei 发表于 2024-7-25 17:14
那你这个只能用代码定制一个数据有效性了。

只针对当前区域写了个,扩展动态区域自己扩展一下吧,很简单

[Visual Basic] 纯文本查看 复制代码
Sub demo()
Dim dic, i%, arr, k$, sr$
Set dic = CreateObject("scripting.dictionary")
arr = Range("a2:b13")  '这里写死的,需扩展
For i = 2 To 13 '这里写死的,需扩展
    k = Range("a" & i).Value
    dic(k) = Range("b" & i).Value & "," & dic(k)
Next
Range("i3:i10").Validation.Delete  '这里写死的,需扩展
Range("i3:i10").ClearContents '这里写死的,需扩展
For i = 3 To 10 '这里写死的,需扩展,以及上面,下面的A,H,I列都写死的,若转到其他列,需要修改
    k = Range("h" & i).Value
    If dic.exists(k) Then
        If VBA.InStr(Left(dic(k), Len(dic(k)) - 1), ",") > 0 Then
            With Range("i" & i).Validation
                .Delete
                .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:=dic(k)
            End With
        Else
            Range("i" & i).Value = Left(dic(k), Len(dic(k)) - 1)
        End If
    End If
Next
End Sub
jyjjf 发表于 2024-7-25 16:06
你试试数据验证方式的二级菜单形式呢,再结合条件格式筛选重复的
lisongmei 发表于 2024-7-25 16:25
支持filter,XLOOKUP版本
=INDEX(FILTER($B$2:$B$13,$A$2:$A$13=I3),COUNT(FILTER($B$2:$B$13,$A$2:$A$13=I3)),1)
或者
=XLOOKUP(I3,$A$2:$A$13,$B$2:$B$13,1000,0,-1)
liu00cheng 发表于 2024-7-25 16:29
曾处理过一个类似的表格…

在J列仅仅一列内,既实现“对不重名的直接匹配”,又实现“对重名的作下拉列表”,只用函数、名称、数据类型这些excel提供的工具,我没找到办法。
我想到的是 加2个辅助列:1个辅助列仅对不重名的直接匹配,另1个辅助列仅对重名的作下拉列表
J列是对这2个辅助列内容的合并

对重名的作下拉列表,我是参照excelhome论坛上的一个“动态下拉列表案例”做的,效果不错,但做起来有点麻烦,涉及数组函数、名称等等
需要的话,等回去我找给你
 楼主| 杜蕾斯八五折 发表于 2024-7-25 16:44
jyjjf 发表于 2024-7-25 16:06
你试试数据验证方式的二级菜单形式呢,再结合条件格式筛选重复的

尝试过,没有达到想要的效果==
 楼主| 杜蕾斯八五折 发表于 2024-7-25 16:45
lisongmei 发表于 2024-7-25 16:25
支持filter,XLOOKUP版本
=INDEX(FILTER($B$2:$B$13,$A$2:$A$13=I3),COUNT(FILTER($B$2:$B$13,$A$2:$A$13= ...

这个只能筛选重名人员中的第二个,我的情况是有时候需要第一个人的编号,有时候需要第二个人的编号。
 楼主| 杜蕾斯八五折 发表于 2024-7-25 16:46
liu00cheng 发表于 2024-7-25 16:29
曾处理过一个类似的表格…

在J列仅仅一列内,既实现“对不重名的直接匹配”,又实现“对重名的作下拉列 ...

您说的类似表格,跟我需要的基本一致。等待您的回复,谢谢!
lisongmei 发表于 2024-7-25 17:14
杜蕾斯八五折 发表于 2024-7-25 16:45
这个只能筛选重名人员中的第二个,我的情况是有时候需要第一个人的编号,有时候需要第二个人的编号。

那你这个只能用代码定制一个数据有效性了。
liu00cheng 发表于 2024-7-25 22:00
杜蕾斯八五折 发表于 2024-7-25 16:46
您说的类似表格,跟我需要的基本一致。等待您的回复,谢谢!

链接: https://pan.baidu.com/s/1FXz49lqWFNJ1DRtIcqMcJw?pwd=6di5
提取码: 6di5

仔细看了您原来的表格,才发现您原来也是一位大神~
看到原来表格中使用了small函数、数组公式,就知道您已经摸到边上了,只是差一个cell函数

链接里面,我放上了excelhome论坛里那个原始演示视频,供参考
特别是这种 动态筛选的操作,与常规的不太一样,您一看就明白了

我只是将那个视频里的公式,直接套进您的表里,勉强能用起来
其他的,按照视频里的方法,您能做出更合适的来
献丑了~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 23:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表