日常做 Excel 表格的人,应该都有过这种体验:发给业务部门一张信息收集表,结果填回来的数据五花八门,同一个区域能写出好几种叫法,门店名称不是多一个字就是少一个字,后期清洗数据洗到怀疑人生。与其让填表人自由发挥,不如从源头把输入框锁死,用下拉菜单让数据“只能选不能写”。
但普通下拉菜单有个痛点:数据一多,翻列表翻得手酸;不同角色的人能看的数据范围又不一样,总不能给每个人都单独做一张表。这篇文章我准备围绕“带权限的下拉菜单”,完整拆解 WPS 表格和 Excel 中如何用 SWITCH + FILTER 实现前级模糊扫、后级精确锁的效果,让下拉菜单既能按关键词快速过滤,又能根据当前用户自动分配可见范围。本文适合经常做业务报表、信息收集表、权限分级填报表的办公人员。看完之后,你可以直接把这个模板套到自己的表格里。
为了让你有更直观的体感,我先说结论:这个方案能做到三件事。第一,一级下拉支持“模糊扫”,输入一个关键词,候选列表自动收缩到匹配项;第二,二级下拉“精确锁”,一级选了什么,二级就只能在它的子集里选,绝不串区;第三,权限范围通过 SWITCH 函数一键切换,不同角色进入同一张表,看到的下拉选项不一样。
1. 背景与核心概念
先聊一个基础问题:为什么需要“动态下拉菜单”?
普通的下拉菜单,Excel 和 WPS 里叫“数据验证”或“数据有效性”,实现方式就是选中一个单元格,在“允许”里选择“序列”,然后填上一个区域。比如你有一个大区列表,放到 A1:A5,然后在数据验证来源里写 =$A$1:$A$5,这个单元格就出现下拉箭头了。
这种静态下拉有两个明显问题:
- 列表太长时,体验很差。几十个甚至上百个选项,用户只能靠滚动查找,效率低,还容易看错行。
- 没有权限控制。所有打开表格的人看到的都是同一个列表,无法根据用户角色显示不同的候选数据。
动态下拉菜单要解决的就是这两个问题。它通过公式动态生成候选区域,让下拉列表的“数据源”不是固定区域,而是根据关键词、上一级选中值、当前用户角色实时计算出来的结果。这就是“动态”的含义。
接下来是 SWITCH 和 FILTER 这两个函数。
FILTER 是动态数组函数,作用从一个区域中按条件筛选出所有匹配的记录。语法不算复杂:
FILTER(要筛选的区域, 包含条件, [没有匹配时返回的值])它最方便的地方在于:筛选结果会自动溢出到旁边的单元格,不需要提前拉公式,也不需要 Ctrl+Shift+Enter。WPS 最新版和 Excel 365 都支持这个函数。
SWITCH 则像一个简化的 if-else if 语句。它根据一个表达式的结果,匹配到对应值并返回:
SWITCH(要判断的表达式, 值1, 结果1, 值2, 结果2, ..., [默认结果])SWITCH 的价值在于:当你有多个角色、多个规则需要映射到不同策略时,一段 SWITCH 比一堆嵌套 IF 清爽得多。比如把角色 A 映射为“前缀匹配”,把角色 B 映射为“包含匹配”,SWITCH 一行就能写完。
把这两个函数组合起来,就能形成一套“权限 + 模糊匹配 + 精确联动”的下拉数据源方案。SWITCH 负责“分配优先权”,决定当前用户用哪种匹配策略、能看到哪些范围;FILTER 负责“执行筛选”,根据 SWITCH 分配好的规则,从原始数据中筛出候选列表。
“前级模糊扫、后级精确锁”这个说法,在业务上可以这样理解:前一级(比如大区)允许用户通过关键词扫选,快速缩小范围;后一级(比如门店)则严格匹配前一级的结果,一旦上级确定,下级只能从它的子集中选择,避免脏数据跨级串用。
2. 场景需求与数据表设计
概念讲完,我们进入一个实际案例。假设你是一家连锁零售公司,需要做一份“门店巡检填报”表格,填表人需要依次选择:大区、门店、负责人。
业务约束如下:
- 不同角色的人看到的可选大区不同。
- 一级大区要支持模糊搜索,输入“华”,候选列表里要出现“华东”“华南”“华北”等相关项。
- 二级门店要严格跟随一级大区,大区选“华东”,门店只能出现华东的门店。
- 负责人信息不需要手填,门店选好后自动带出。
先规划数据表。整个工作簿里,我建议至少放四张表:权限表、大区表、门店基础信息表、填报界面表。数据表分层的好处是方便维护,门店信息一变,下拉菜单自动跟着变,不用去改公式。
2.1 权限表
新建一个工作表,命名为“权限表”,内容如下:
| 用户 | 角色 | 备注 |
|---|---|---|
| 张三 | A | 仅华东 |
| 李四 | B | 华南 + 华北 |
| 王五 | C | 全部 |
这里的角色是自定义的,你可以根据业务灵活调整。角色 A 代表只能看到华东,角色 B 能看到华南和华北,角色 C 所有大区可见。后面我们会用 SWITCH 把这个角色编码翻译成“可见范围文本”。
2.2 大区表
新建工作表“大区表”,A 列维护所有大区名称:
| 大区 |
|---|
| 华东 |
| 华南 |
| 华北 |
大区表独立维护,后面一级下拉的权限判断会引用它。
2.3 门店基础信息表
新建工作表“基础数据”,A 列是大区,B 列是门店,C 列是负责人。这张表是二级下拉的数据源:
| 大区 | 门店 | 负责人 |
|---|---|---|
| 华东 | 上海一号店 | 张伟 |
| 华东 | 杭州西湖店 | 李明 |
| 华南 | 广州天河店 | 陈晨 |
| 华南 | 深圳南山店 | 刘洋 |
| 华北 | 北京朝阳店 | 孙悦 |
| 华北 | 天津和平店 | 周杰 |
这里说明一下:实际业务中,大区表应该作为“父级数据源”,基础数据表作为“子级数据源”。父级选了什么,子级就筛什么。这个思路是多级联动下拉菜单的通用设计。
2.4 填报界面表
新建工作表“填报”,这是用户实际填写的地方。表格布局如下:
| 单元格 | 用途 |
|---|---|
| A1 | 当前用户,手填或从其他系统带出 |
| B1 | 角色,根据 A1 自动查找 |
| C1 | 可见范围,SWITCH 根据角色生成 |
| D1 | 匹配策略,SWITCH 根据角色生成 |
| A2 | 一级关键词,用于前级模糊扫 |
| B2 | 一级下拉结果,大区 |
| C2 | 二级下拉结果,门店 |
| D2 | 负责人,自动带出 |
| F2 起 | 权限标记辅助列 |
| G2 起 | 关键词匹配辅助列 |
| A5:A20 | 一级候选列表,作为 B2 下拉来源 |
| C5:C20 | 二级候选列表,作为 C2 下拉来源 |
下面开始一步步写公式。
3. 权限与匹配策略:SWITCH 一键分配
先处理用户角色。在 B1 单元格写入:
=IFERROR(VLOOKUP(A1,权限表!$A$2:$C$4,2,0),"未知")这个公式根据 A1 填写的用户名,去“权限表”里匹配角色。如果用户不存在,返回“未知”。
然后在 C1 单元格写入可见范围映射:
=SWITCH(B1,"A","华东","B","华南,华北","C","全部","无权限")这一步就是“一键分配”的核心。SWITCH 把角色 A 映射为“华东”,角色 B 映射为“华南,华北”,角色 C 映射为“全部”。这个文本会作为后续 FILTER 筛选时的权限条件。
继续在 D1 单元格写入匹配策略:
=SWITCH(B1,"A","前缀","B","包含","C","全部","包含")这里再说细一点:不同角色对输入关键词的处理方式不同。角色 A 只允许“前缀匹配”,也就是输入的关键词必须是大区名称的开头;角色 B 允许“包含匹配”,关键词出现在大区名称任意位置都可以;角色 C 不做限制,直接列出所有可见大区。这就是文章标题里“优先权”的一种体现——SWITCH 根据角色动态决定优先级规则。
如果你的 WPS 版本不支持 SWITCH,可以用多层 IF 代替:
=IF(B1="A","华东",IF(B1="B","华南,华北",IF(B1="C","全部","无权限")))效果一样,只是写起来繁琐一点。
4. 前级模糊扫:一级下拉数据源
一级下拉需要做到:在权限范围内,根据关键词动态过滤大区。
这里我们先用两个辅助列,把“权限是否可见”和“关键词是否匹配”拆开判断。这样做的好处是公式逻辑清晰,排查问题也方便。
填写在“填报”表 F2 单元格,然后下拉填充到基础数据最后一行对应的行号:
=IF($C$1="全部",1,--ISNUMBER(FIND(基础数据!$A2,$C$1)))G2 单元格写入关键词匹配标记:
=IF(OR($A$2="",$D$1="全部"),1,IF($D$1="前缀",--(LEFT(基础数据!$A2,LEN($A$2))=$A$2),--ISNUMBER(FIND($A$2,基础数据!$A2))))解释一下这两个辅助列的思路:
- F 列判断当前大区是否落在当前用户可见的范围内。C1 为“全部”时直接返回 1,表示所有大区可见;否则用 FIND 判断大区名称是否包含在 C1 的文本串中。
- G 列判断当前大区是否匹配关键词。如果 A2 关键词为空,或者当前角色不限制关键词,直接返回 1;如果角色是“前缀”,就判断大区名称是否以关键词开头;如果角色是“包含”,就用 FIND 判断关键词是否出现在大区名称里。
有了这两个辅助列,一级候选列表就很好写了。在 A5 单元格输入动态数组公式:
=FILTER(大区表!$A$2:$A$4, COUNTIFS(基础数据!$A$2:$A$7,大区表!$A$2:$A$4,基础数据!$A$2:$A$7,">0")*($F$2:$F$7=1)*($G$2:$G$7=1))这个公式稍长,我们先不急着复制。它的大致思路是:从“大区表”的 A2:A4 区域筛出那些同时满足“在基础数据中存在”“F 列权限允许”“G 列关键词匹配”的大区。
不过这个公式里 COUNTIFS 部分是为了确保大区表里的大区确实有门店记录,属于一种数据完整性保护。如果你的大区表本身就和基础数据一一对应,可以直接简化成:
=FILTER(大区表!$A$2:$A$4, ($F$2:$F$7=1)*($G$2:$G$7=1))注意:F 列和 G 列的辅助标记,是按基础数据的行数生成的。如果你把大区表单独维护,更严谨的写法是把辅助列放到大区表旁边,让每一行对应一个大区。我在工程建议部分会再展开这一点。
如果你的 WPS 或 Excel 版本不支持 FILTER,也可以用传统的 INDEX + SMALL 数组公式实现同样效果。在 A5 输入:
=IFERROR(INDEX(大区表!$A$2:$A$4,SMALL(IF(($F$2:$F$7=1)*($G$2:$G$7=1),ROW($A$2:$A$4)-1),ROW(A1))),"")这个公式需要按 Ctrl + Shift + Enter 确认,然后向下拖拽填充。它的核心思想是:用 IF 判断哪些行满足条件,满足条件时返回对应的行号,再用 SMALL 依次取出第 1、第 2、第 3 个匹配项,最后用 INDEX 从大区表里取值。
到这里,一级候选列表已经有了。接下来把它绑定到单元格 B2 上,用户就能看到下拉箭头。
选中 B2 单元格,点击“数据”选项卡下的“数据验证”(WPS 中叫“有效性”),在“设置”里把“允许”改为“序列”,来源填写:
=$A$5:$A$20注意勾选“提供下拉箭头”和“忽略空值”。这样当 A5:A20 区域里有些单元格没内容时,下拉列表里不会出现空白选项。
5. 后级精确锁:二级下拉数据源
一级搞定后,二级就容易多了。二级的逻辑是:根据 B2 选择的大区,从基础数据表里精确筛出门店。
在 C5 单元格输入动态数组公式:
=FILTER(基础数据!$B$2:$B$7, 基础数据!$A$2:$A$7=$B$2)这句公式的意思很直白:筛选基础数据表 B2:B7 区域,条件是 A 列大区等于 B2 选中的大区。一级选“华东”,二级候选就是上海一号店和杭州西湖店;一级选“华北”,候选就是北京朝阳店和天津和平店。这就实现了“后级精确锁”。
如果你使用的是老版本 WPS 或 Excel,没有 FILTER,可以用下面的数组公式:
=IFERROR(INDEX(基础数据!$B$2:$B$7,SMALL(IF(基础数据!$A$2:$A$7=$B$2,ROW($B$2:$B$7)-1),ROW(A1))),"")同样需要三键确认并向下填充。
然后选中 C2 单元格,设置数据验证,允许“序列”,来源填写:
=$C$5:$C$20这里有两点需要提醒:
- C2 的数据源是 C5:C20,而不是整个门店列表。所以二级下拉永远不会出现不属于当前大区的门店。
- B2 如果被清空,C5 区域的公式会因为没有匹配项而返回空,C2 下拉也会跟着变空,这属于正常的联动行为。
负责人 D2 的公式是精确匹配查询:
=IFERROR(INDEX(基础数据!$C$2:$C$7,MATCH(1,(基础数据!$A$2:$A$7=$B$2)*(基础数据!$B$2:$B$7=$C$2),0)),"")这是一个多条件查找。MATCH 在行列表中找同时满足“大区等于 B2”和“门店等于 C2”的行,然后 INDEX 从 C 列返回负责人姓名。如果 B2 或 C2 为空,公式返回空值。
到这一步,整个“前级模糊扫、后级精确锁、SWITCH 分配权限”的核心链路已经通了。
6. 完整公式汇总与配置清单
为了方便你直接照抄,我把所有公式和配置集中列出来。请务必注意,工作表的名称要和公式里写的完全一致,否则会出现引用错误。
权限表:
| 单元格 | 值 |
|---|---|
| A2 | 张三 |
| B2 | A |
| C2 | 仅华东 |
| A3 | 李四 |
| B3 | B |
| C3 | 华南 + 华北 |
| A4 | 王五 |
| B4 | C |
| C4 | 全部 |
大区表:
| 单元格 | 值 |
|---|---|
| A2 | 华东 |
| A3 | 华南 |
| A4 | 华北 |
基础数据表:
| 单元格 | 值 |
|---|---|
| A2 | 华东 |
| B2 | 上海一号店 |
| C2 | 张伟 |
| A3 | 华东 |
| B3 | 杭州西湖店 |
| C3 | 李明 |
| A4 | 华南 |
| B4 | 广州天河店 |
| C4 | 陈晨 |
| A5 | 华南 |
| B5 | 深圳南山店 |
| C5 | 刘洋 |
| A6 | 华北 |
| B6 | 北京朝阳店 |
| C6 | 孙悦 |
| A7 | 华北 |
| B7 | 天津和平店 |
| C7 | 周杰 |
填报表公式:
| 单元格 | 公式 | 说明 |
|---|---|---|
| B1 | =IFERROR(VLOOKUP(A1,权限表!$A$2:$C$4,2,0),"未知") | 根据用户查角色 |
| C1 | =SWITCH(B1,"A","华东","B","华南,华北","C","全部","无权限") | 角色到可见范围 |
| D1 | =SWITCH(B1,"A","前缀","B","包含","C","全部","包含") | 角色到匹配策略 |
| F2 | =IF($C$1="全部",1,--ISNUMBER(FIND(基础数据!$A2,$C$1))) | 权限辅助标记,下拉填充 |
| G2 | =IF(OR($A$2="",$D$1="全部"),1,IF($D$1="前缀",--(LEFT(基础数据!$A2,LEN($A$2))=$A$2),--ISNUMBER(FIND($A$2,基础数据!$A2)))) | 关键词匹配辅助标记,下拉填充 |
| A5 | =FILTER(大区表!$A$2:$A$4,($F$2:$F$7=1)*($G$2:$G$7=1)) | 一级候选(动态数组版) |
| C5 | =FILTER(基础数据!$B$2:$B$7,基础数据!$A$2:$A$7=$B$2) | 二级候选(动态数组版) |
| D2 | =IFERROR(INDEX(基础数据!$C$2:$C$7,MATCH(1,(基础数据!$A$2:$A$7=$B$2)*(基础数据!$B$2:$B$7=$C$2),0)),"") | 负责人自动带出 |
数据验证配置:
| 单元格 | 允许 | 来源 |
|---|---|---|
| B2 | 序列 | =$A$5:$A$20 |
| C2 | 序列 | =$C$5:$C$20 |
如果你用的是老版本,A5 和 C5 请改用前面的 INDEX + SMALL 数组公式,并记得按 Ctrl + Shift + Enter 确认后下拉填充。下面给出可以直接复制到老版本表格的数组公式写法。
A5 的老版本写法:
=IFERROR(INDEX(大区表!$A$2:$A$4,SMALL(IF(($F$2:$F$7=1)*($G$2:$G$7=1),ROW(大区表!$A$2:$A$4)-1),ROW(A1))),"")C5 的老版本写法:
=IFERROR(INDEX(基础数据!$B$2:$B$7,SMALL(IF(基础数据!$A$2:$A$7=$B$2,ROW($B$2:$B$7)-1),ROW(A1))),"")老版本数组公式有一个特点:你只能在编辑栏看到公式,按三键后,公式两边会出现花括号。如果直接复制粘贴,很容易丢失三键状态,所以最好手动输入并确认。
到这里,表格已经可用了。你可以在 A1 输入不同用户,测试一下下拉列表的变化:张三登录,一级关键词为空时,候选只有“华东”;输入“华”,候选还是只有“华东”;李四登录,候选会变成“华南”和“华北”;王五登录,候选是所有大区。这个效果就是“带权限”的体现。
7. 常见问题与排查思路
表格搭建过程中,最容易出问题的几个点,我系统整理了一下,方便你对照排查。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 下拉列表没有内容 | 数据验证来源区域为空,或辅助列公式报错 | 检查 A5、C5 公式是否正常返回结果;确认数据验证来源填的是区域,不是普通文本 |
| 下拉列表出现空白行 | 辅助区域里有多余的空单元格 | 来源区域范围缩小,或勾选“忽略空值” |
| 输入关键词后列表没变化 | 辅助列 G 列没有参与筛选,或者 A2 单元格不在公式引用范围内 | 确认 G2:G7 下拉填充完整,确认 A5 公式里引用了 G 列 |
| 二级下拉出现其他大区的门店 | 数据验证来源直接引用了完整门店列 | 确认 C2 的来源是 C5:C20,而不是基础数据整列 |
| SWITCH 返回“无权限” | B1 角色没有匹配到任何分支 | 检查 B1 的 VLOOKUP 是否匹配成功,权限表里角色编码是否一致 |
| FILTER 函数提示不可用 | WPS 版本过旧,不支持动态数组函数 | 改用 INDEX + SMALL 数组公式,或用辅助列 + 公式下拉 |
| 用户切换后列表不刷新 | 数据验证区域是静态引用,公式重算不及时 | 按 F9 强制重算,或检查是否开启了手动计算模式 |
| 负责人不自动带出 | B2 或 C2 为空,或门店名称有空格 | 确认 C2 已选择门店,基础数据里的门店名称前后没有不可见空格 |
这里重点说两个高频坑。
第一个坑是“FILTER 用不了”。WPS 的个人版历史版本对动态数组函数的支持并不完整,如果你输入 FILTER 后没有自动溢出,而是只显示第一条记录或者直接报错,说明你的版本不支持。不要纠结,直接切换成数组公式。代码层面多几行,但兼容性最好。
第二个坑是“数据验证来源不能直接写 FILTER”。很多读者第一反应是把数据验证来源直接写成 =FILTER(...),这在 Excel 365 和 WPS 某些新版本里可能不生效。数据验证的来源本质上需要引用一个区域或名称,而不是动态数组表达式。所以我们的方案是:先用公式在辅助区生成候选列表,再把数据验证来源指向那个区域。这是一种稳定、通用、兼容性好的做法。
8. 最佳实践与工程建议
这套方案在小型业务表里很好用,但要做到规范、稳定、可维护,还有几个细节值得注意。
第一,基础数据不要使用整列引用。很多教程喜欢写 FILTER(A:A, ...),虽然公式简短,但会拖慢表格速度,特别当数据源在数千行以上时,下拉候选列表的刷新会明显卡顿。最佳实践是给基础数据定义一个动态名称,比如:
=OFFSET(基础数据!$A$2,,,COUNTA(基础数据!$A:$A)-1,3)这样即使数据增加了,范围也能自动扩展,同时又不会扫描整列。数据源越大,越能感觉到这个优化的价值。
第二,辅助列不要随手放在填报区里,如果担心用户误删,可以放到一个单独的“辅助计算”工作表,或者把辅助列放到数据区域右侧,并加上隐藏保护。表格一旦交给别人填,各种误操作随时可能发生,辅助列是整个联动逻辑的命脉,不能暴露给普通填表人。
第三,权限控制的边界要认识清楚。这里的 SWITCH 权限分配,解决的是“下拉选项里看不到”的问题,它属于前端交互约束,不能替代数据库层面的权限控制。如果用户手动输入一个不在下拉列表里的门店名称,表格是没有办法通过现有函数拦截的。要做到严格拦截,需要配合数据验证的“出错警告”设置,或者进一步用 VBA 代码监听单元格变化。小型报表用纯函数方案已经完全足够,但如果涉及数据敏感度高、需要严格审计的场景,建议权限控制尽量放在后端服务里。
第四,名称管理器的使用能显著简化维护。如果你想彻底摆脱“下拉来源固定区域”的限制,可以把 A5 开始的一级候选区域定义成一个名称,比如“一级列表”,然后在数据验证来源里直接填 =一级列表。名称引用的区域可以用 OFFSET 动态计算,这样无论候选列表是 3 项还是 30 项,下拉菜单都会自动适配,不需要手动改区域范围。
名称的引用位置可以这样设置:
=OFFSET(填报!$A$5,,,COUNTIF(填报!$A$5:$A$20,"?*"))这个名称的核心逻辑是:统计 A5:A20 里有多少个非空单元格,然后用 OFFSET 把区域高度设置为这个数值。这样下拉菜单就不会出现空白选项了。
第五,关键词模糊扫的体验优化。如果用户输入的关键词没有匹配项,一级候选列表会完全空白。这时候填表人往往不知道是没数据还是公式坏了。建议在 A2 左侧加一个提示单元格,用条件格式或者公式提示“当前无匹配项”。比如:
=IF(AND($A$2<>"",COUNTA($A$5:$A$20)=0),"未找到匹配大区","")这个提示放在 A3 单元格,配合红色字体,用户体验会好很多。
最后说说多级联动的扩展。本文案例是“大区 → 门店 → 负责人”三级关系,其中负责人是用公式自动带出的,不算真正意义上的第三级下拉。如果你的业务里有“省 → 市 → 区”这种真正的三级下拉,逻辑可以继续叠加:二级下拉确定后,三级下拉再用 FILTER 筛选“市等于二级选中值”的区域。数据表设计上,每一级都要有自己的父级字段,比如门店表里有“大区”字段,区县表里有“城市”字段,然后逐级筛选。这个模式可以一路延伸到四层、五层,原理完全一致。
多级联动的核心就是一条:每一级下拉的数据源,都受上一级选中值约束。不要试图在一张表里堆所有层级,而是把层级关系拆到独立的数据表里,靠“父级字段”串联。这样无论是维护门店改名、新增城市,还是调整权限范围,都只需要改数据表,不需要动公式。
日常维护这块,我还有一个建议:权限表不要和填报界面放在同一个工作表里。放在独立的“权限表”里,方便管理员修改;如果多个报表需要共用同一套权限,可以把权限表定义成名称,方便跨表引用。权限变更时,只需要在权限表里改一行,所有关联工作表的可见范围就会自动更新。
另外,数据验证的“输入提示”和“出错警告”也值得用好。在 C2 门店下拉的“输入信息”标签里写一句“请先选择大区,再选择门店”,能显著降低填表人的困惑。出错警告样式可以选择“停止”,当用户输入不在列表里的内容时直接阻止,这就把前端的模糊约束又加固了一层。
9. 总结与下一步
这篇文章从一个真实的填报表场景出发,完整实现了带权限控制的两级动态下拉菜单。
回顾一下核心要点:
- FILTER 负责动态筛选,让下拉候选列表根据关键词、父级选中值和权限范围实时变化。
- SWITCH 负责角色映射和策略分配,把不同的用户角色翻译成“可见范围”和“匹配策略”,实现一键分配优先权。
- 前级模糊扫通过关键词辅助列实现,后级精确锁通过 FILTER 严格匹配父级选中值实现。
- 数据验证来源统一引用辅助区域,保证兼容性和稳定性。
- 老版本用户可以使用 INDEX + SMALL 数组公式作为 FILTER 的替代方案。
整个方案属于“公式纯函数”方案,不依赖 VBA,适合 WPS 和 Excel 的常规版本使用。如果你的表格逻辑更复杂,比如需要限制同一账号只能填写一次、需要记录填写时间、需要在下拉选择后自动锁定单元格,那就要考虑引入 VBA 或脚本编辑器做数据校验。但那是另一个层级的话题了。
如果你正好在做信息收集表、巡检表、任务分配表这类需要多人填写且范围受限的表格,我建议你直接把我这份示例搬到自己的工作表里跑一遍。先不用管权限规则如何复杂,先把两级联动的骨架搭起来,再把 SWITCH 的角色分支往里面填,很快就能体会到函数组合的威力。
后续我准备继续拆解三到五级联动的下拉菜单写法,以及如何用名称管理器 + 数据验证把动态候选列表做得更优雅。如果你在搭建过程中遇到报错,或者有更好的联动思路,欢迎在评论区交流。