
做报价单、发货登记、门店归属这类表格时,省份和城市往往是两级依赖的:选了浙江省,城市下拉里就不该再冒出成都和西安。把所有城市堆进一个下拉,不光翻起来费劲,还容易选错,事后核对数据要一格一格看。下面这套做法只用名称管理器和 INDIRECT 函数,不写宏、不加辅助列,做完以后新增一个省、删改几个城市,都只需要动对照表。
一、先把对照表摆成「一列一个分类」
新建一张工作表,命名为「对照表」。第一行横着写省名,从 A1 开始依次是浙江省、江苏省、广东省。每个省名下面竖着写它下辖的城市,一个格子一个。各列长度不一样没关系,短列底下留空就行,不用补齐。
几条硬性要求:省名不能重复;第一行不要有合并单元格;每个省的城市从列头下面第一格开始连续往下写,中间不留空行。中间空了会让后面的名称区域断掉,区域里多选的空格子在下拉中会显示成空白项。
如果手上已经是「A 列省、B 列城市」的两列明细表,也可以不改造,直接看第四节里用 FILTER 的写法。
二、用名称管理器批量建名字
名称管理器是整个联动的地基,它的作用是给一块区域起一个人能看懂的名字,后面公式只要念出这个名字,就能拿到那块数据。
手工建单个名称:选中某个省下面的城市区域(不要连列头一起选),按 Ctrl+F3 打开名称管理器,点「新建」,名称填这个省的名字,比如「浙江省」,引用位置确认无误后确定。
省多了这样一格格点很费时间。批量做法是:选中整个区域(这次要连第一行的列头一起选),切到「公式」选项卡,点「根据所选内容创建」,弹窗里只勾「首行」,确定。表格会按第一行的文字一次性建好全部名称。
验证一下:点编辑栏左边的名称框,下拉列表里应该能看到所有省名,随便点一个,光标会跳到对应的城市区域。看不到就说明上一步的勾选或者区域选错了。
三、一级下拉和二级联动
假设省份填在 B2,城市填在 C2。
- 选中 B2,点「数据」→「数据验证」(部分版本叫「数据有效性」),允许里选「序列」。
- 来源填
=对照表!$A$1:$C$1,或者直接用鼠标框选第一行的省名。确定后 B2 就有了省份下拉。 - 选中 C2,同样打开数据验证,允许选「序列」,来源填
=INDIRECT(B2)。 - 确定,回到表格先选省份,再点城市那一格,下拉里就只剩这个省的城市了。
原理不复杂:INDIRECT 的作用是把一段文字当成引用地址来解析。B2 里是「浙江省」,INDIRECT(B2) 就等于问表格「有没有一个叫浙江省的名称」,有的话返回它指向的那块区域,数据验证拿到的来源自然就是这一列城市。
联动能成立的前提是 B2 的内容和名称一字不差。手工敲进去多一个空格、少一个字,都会让 INDIRECT 找不到名称,城市下拉直接变空。
四、名称不合规时怎么绕开
名称有硬性限制:不能以数字开头,不能含空格,不能长得像单元格地址(A1、R1C1 这类),也不能是 C、R 这种保留字母。省名一般不会踩坑,换成仓库、客户等级、产品型号就很容易撞上,比如「1号仓」「上海 浦东」「A类客户」。
处理办法是在对照表旁边加一行规范名,用公式把非法字符替换掉,例如 ="_"&SUBSTITUTE(A1," ",""),把空格去掉、前面补下划线。名称按规范名建,数据验证的来源写成 =INDIRECT(SUBSTITUTE(B2," ","")),两边用同一套替换规则,就能对上。
分类特别杂、替换规则写不干净的时候,改用两列明细加动态数组:数据验证来源填 =FILTER(明细!$B:$B,明细!$A:$A=$B2)。这需要 Excel 2021 或 Microsoft 365,旧版本不支持把动态数组直接写进来源,得先把结果落到一列辅助单元格,再引用那一列。
五、扩到三级联动与常见故障
省市县三级是同样的思路,只是名称要能拼接出来。给每个市建名称时用「省_市」的格式,比如「浙江省_杭州市」,数据验证来源写 =INDIRECT($B2&"_"&$C2)。名称数量会翻好几倍,建的时候可以用「根据所选内容创建」配合两级表头(首行和最左列都勾上),一次生成。
用起来不灵,按下面几条对一遍:
- 城市下拉是空的:多半是 INDIRECT 里的文字和名称对不上,去名称管理器里逐个核对拼写和空格。
- 单元格显示 #REF!:名称被删除,或者对照表里被删了整行整列,区域失效。
- 下拉里多出空白项:城市列中间有空行,或者区域多选了几格空白单元格。
- 发给同事后失效:名称跟着工作簿走,但对照表被改名、被删除、或者被另存成新文件后区域指向变了,都会断。
- 跨工作簿引用:数据验证的来源不能直接指向别的工作簿,会退化成外部链接,对方打开就是空下拉。
这套东西做完,维护成本基本落在对照表上:新增一个省,就在第一行末尾加一列省名,下面写城市,再用「根据所选内容创建」补一个名称,原来的公式一行都不用改。城市增删直接在列里改,下拉自动跟着变,因为名称指向的是整列区域而不是具体几个格子。
几个容易忽略的点:对照表的省名和一级下拉里的文字必须来自同一处,别一边手打一边引用;做好的模板建议把对照表设为隐藏而不是删除,删了整张表所有 INDIRECT 都会报错;如果表格要发给别人填写,先在对方机器上试一次,确认版本支持所用的函数;数据验证只能拦住手工输入,粘贴进来的内容不受限制,做统计前还是要单独查一遍有没有越界的值。

