要实现Excel二级联动下拉菜单,需先在“数据源”表中按列结构化录入省份与城市,确保省份标题与一级选项完全一致;再为每列城市定义同名动态名称;最后用数据验证设置一级序列来源为省份行,二级来源为=INDIRECT($A2)。

要在Excel中实现“选省份→自动显示对应城市”的二级联动下拉菜单,必须让第二个下拉列表的选项随第一个单元格内容实时变化,否则每次手动维护城市列表极易出错、数据不一致、协作成本高。
整理结构化数据源
把所有省份和对应城市按列排布:第1行写省份名(如“北京”“广东”“四川”),每个省份下方紧贴着列出其全部地级市,城市之间不能留空行。例如N1填“北京”,N2:N5填“东城”“西城”“朝阳”“海淀”;O1填“广东”,O2:O21填“广州”“深圳”“珠海”……以此类推。
这一步最关键——【省份列标题必须与一级下拉中将出现的文字完全一致,且不能含空格、括号或换行】。比如一级菜单要显示“内蒙古自治区”,那O1就必须写“内蒙古自治区”,不能简写为“内蒙古”,否则INDIRECT函数查不到名称会报错#REF!。
建议单独新建一个名为“数据源”的工作表来存放这些列,避免和业务表混在一起。
为每个省份城市列定义名称
方法一:快捷批量创建
选中整个数据区域(含首行省份名和下方所有城市),按 Ctr+G 打开定位对话框 → 选择“常量” → 确定 → 此时所有有数据的单元格被选中 → 切换到「公式」选项卡 → 点击「根据所选内容创建」→ 勾选「首行」→ 确定。
方法二:手动逐个定义(适合数据列少或需精确控制)
选中“北京”所在列(如N1:N5)→ 公式 → 名称管理器 → 新建 → 名称填“北京”,引用位置填=数据源!$N:$N → 确定。重复此操作为“广东”“四川”等列分别定义同名名称。
定义完成后,在任意单元格输入=北京,回车就能看到“东城”垂直数组,说明名称已生效。
设置一级下拉菜单(省份)
第一步:选中要放置省份的单元格(如Sheet1的A2)
第二步:数据 → 数据验证 → 允许:序列 → 来源:【直接选取“数据源”表的第1行,即省份标题行,例如=数据源!$N$1:$Z$1】
第三步:勾选“忽略空值”和“提供下拉箭头”,确定。
此时A2会出现下拉箭头,点击即可选择“北京”“广东”等。注意不要选整行(如$1:$1),否则会引入大量空白单元格导致下拉列表冗长卡顿。
设置二级下拉菜单(城市)
选中对应城市的单元格(如Sheet1的B2)→ 数据 → 数据验证 → 允许:序列 → 来源框内输入公式:=INDIRECT($A$2) → 确定。
这个公式会把A2单元格的内容(比如“北京”)当作名称去查找,从而调出“北京”名下定义的城市列表。如果A2改成“广东”,B2下拉项立刻变成“广州”“深圳”……
若需向下填充多行联动(如A2:A100选省份,B2:B100同步变城市),请把公式改为=INDIRECT($A2)——行号相对引用,这样拖动填充时每行都能正确关联本行的省份值。


















