先把原始表整理成这个样子
找个空地方(或者单独一张工作表)做对照表:第一行写省份,从第二行开始往下写这个省下面的城市,一列一个省。比如 A1 写「江苏」,A2 往下填「南京、苏州、无锡」;B1 写「浙江」,B2 往下填「杭州、宁波、温州」。
注意三点:第一行必须是省份名,且和目标表里下拉出来的字一模一样;城市中间不要留空行;不要用合并单元格。这三样里坏一样,后面就白干。
这张表可以后期隐藏起来,或者挪到一张叫「数据源」的工作表里,眼不见心不烦。
第二步:给每列起个名字
选中整张对照表(含第一行省份名),按 Ctrl+Shift+F3,或者进「公式」→「根据所选内容创建」。弹出的窗口里只勾选「首行」,确定。
这一步的含义是:Excel 会以每个省的名字为名称,把那一列下面的城市区域定义成一个名字。可以在「公式」→「名称管理器」里查看,会看到「江苏」对应着某个 RefersTo。
顺手说一句,这一步是整件事的核心,很多人失败就是因为跳过了它,直接用 INDIRECT 引用地址。坚持用名称管理器,后期加城市只要调整区域范围就行。
第三步:一级下拉,用最普通的序列
选中要填省份的那一片单元格,「数据」→「数据验证」,允许里选「序列」,来源直接框选对照表的第一行(也就是那几个省所在的整行),确定。到这里省份列能选了。
第四步:二级下拉,关键是 INDIRECT
选中要填城市的那一片,「数据」→「数据验证」,允许还是「序列」,来源这次输入:
=INDIRECT($A2)
这里的 A2 换成本行一级下拉所在的单元格。它做的事是:把 A2 里的文字(比如「江苏」)当成名称去引用对应的城市区域,于是二级下拉就跟着变了。
写完这一个,往下拖填充即可。
翻车点排查
提示「源当前包含错误」:多数是城市列里有空格或多行了处理不当,先把对照表重排一遍。
二级下拉不跟着变:检查 INDIRECT 里的一级单元格是不是写死了行号以外的东西,或者对照表首行的省名和一级下拉的选项是否完全一致,多一个空格都不行。
改了一个省、另一个省的城市也跟着变:一级下拉单元格位置写错位了。
WPS 表格的操作位置和名字基本一致,「数据」→「有效性」,同样支持 INDIRECT,不用换软件。
