求可按输入姓名返回其所在所有Excel工作表的Formula或VBA方案
实现Excel按姓名查找有权限的所有应用(工作表)方案
我懂你的需求啦——输入一个姓名,Excel就能自动列出这个用户有权限访问的所有应用(也就是包含该姓名的工作表)。之前找公式没碰到合适的?没关系,我给你准备了两种现成的方案,不管是用公式还是VBA,你直接拿来用就行:
方案一:Excel公式实现(无需代码)
这个方案适合不想接触VBA的情况,假设你把目标姓名输入在单元格A1,可以在另一个单元格(比如B1)粘贴下面的公式:
=TEXTJOIN(", ", TRUE, IF(ISNUMBER(MATCH(A1, INDIRECT("'"&SheetNames&"'!A:A"), 0)), SheetNames, ""))
前置步骤:定义「SheetNames」名称
要让公式生效,得先给所有工作表名创建一个自定义名称:
- 按下
Ctrl+F3打开「名称管理器」,点击「新建」 - 名称栏填
SheetNames,引用位置输入:=REPLACE(GET.WORKBOOK(1),1,FIND("]",GET.WORKBOOK(1)),"") - 点击「确定」保存
公式使用说明:
- 如果你的Excel是365/2021版本,输入公式后直接回车即可;如果是更早版本,需要按
Ctrl+Shift+Enter触发数组公式 - 公式里的
A:A是假设每个工作表的用户名单存放在A列,你可以改成实际的列(比如C:C) - 记得开启「迭代计算」:点击「文件>选项>公式」,勾选「启用迭代计算」,因为用到的
GET.WORKBOOK是易失性函数,需要迭代更新
方案二:VBA自定义函数(更稳定灵活)
如果公式的限制让你觉得麻烦,VBA方案会更可靠,还能自定义查找范围。步骤超简单:
- 打开你的Excel文件,按下
Alt+F11打开VBA编辑器 - 在左侧「工程资源管理器」里右键点击你的工作簿,选择「插入>模块」
- 在弹出的代码窗口粘贴以下代码:
Function GetUserApps(targetName As String) As String Dim ws As Worksheet Dim result As String Dim foundRange As Range '遍历工作簿中所有工作表 For Each ws In ThisWorkbook.Worksheets '在当前工作表的A列精确查找目标姓名(可修改为实际用户列,比如"B2:B1000") Set foundRange = ws.Range("A:A").Find(What:=targetName, LookIn:=xlValues, LookAt:=xlWhole) If Not foundRange Is Nothing Then '找到后拼接工作表名(应用名) If result = "" Then result = ws.Name Else result = result & ", " & ws.Name End If End If Next ws '返回结果,未找到时提示 GetUserApps = IIf(result = "", "无权限应用", result) End Function
- 关闭VBA编辑器,回到Excel工作表,在任意单元格输入
=GetUserApps(A1)(把A1换成你输入姓名的单元格),回车就能得到结果!
VBA代码说明:
- 代码会遍历所有工作表,精确匹配目标姓名(避免部分匹配的错误)
- 你可以把
ws.Range("A:A")改成实际存放用户名单的范围(比如ws.Range("B2:B500")),这样查找效率更高 - 如果没有找到匹配的姓名,会返回「无权限应用」,清晰直观
两种方案都能直接用,VBA方案在工作表数量多的时候更稳定。如果用公式,记得确认你的Excel版本支持TEXTJOIN(2019及以后或365)。
内容的提问来源于stack exchange,提问作者user5947860
相关产品推荐
相关产品推荐

