【excel】设置二级可变联动菜单

文章目录

  • 【需求】在一级菜单选定后,二级菜单联动显示一级菜单下的可选项
  • 【步骤】
    • step1 制作辅助列
      • 1.列转行
      • 2.在辅助列中匹配班级成员
    • step2 名称管理器
    • step3 制作二级下拉菜单
    • step4 消除二级菜单中的空白
  • 【总结】

之前做完了 【excel】设置可变下拉菜单(一级联动下拉菜单),开始做二级联动菜单。

【需求】在一级菜单选定后,二级菜单联动显示一级菜单下的可选项

示例:A、B列为原始明细数据。
K2单元格为一级菜单,在K2单元格内容选定后,要求在L2单元格的下拉菜单中,显示K2对应的内容。
如,K2单元格为”一班“时,L2下拉菜单中,显示”一班“成员的列表:
在这里插入图片描述

【步骤】

在【excel】设置可变下拉菜单(一级联动下拉菜单)中,我们曾做过一个辅助列(辅助单元格),在此处具体步骤略。
我们从这篇文章的内容出发向下走。所以,当前我们的表格已经是这样的:
在这里插入图片描述
我们的目标是在G2单元格做二级下拉菜单。

step1 制作辅助列

1.列转行

辅助列D1单元格的公式写好以后,我们先将里面的内容横向展开。
选择I1单元格输入公式:=OFFSET($D$1,COLUMN(A1)-1,0)&"",然后横向拖动,多填几列(比如填充10列,就是预留出10个班级…具体根据实际需要)
OFFSET()公式,在这里是取D1单元格中的内容,这里COLUMN(A1)中的单元格是随着拖动公式而变化的。
在I1中,偏移量是1-1=0,OFFSET($D$1,COLUMN(**A1**)-1,0)的结果是D1单元格中的第一项,也就是”一班“;
公式拖动到J1的时候偏移量是2-1=1,OFFSET($D$1,COLUMN(**B1**)-1,0)的结果是D1单元格中的第二项,也就是”六班“;
公式向右拖动n个单元格,就是偏移n-1,相应的取第n项(注意这里的逻辑,从第一项,偏移n-1个,就是第n项,没问题吧?)。
在这里插入图片描述
公式后面的&“”,是将向右拖动的结果中的0替换为空。
因为拖动公式的单元格数量可能超过D1单元格中班级的数量,如果不写&"",后面的结果中将出现0,这是我们不想看到的:
在这里插入图片描述
&""可以将结果强制转换成文本,这样结果中的0就不再显示出来了。

2.在辅助列中匹配班级成员

在I2单元格写入公式=INDEX($B:$B,SMALL(IF($A$1:$A$100=I$1,ROW($1:$100),4^8),ROW(A1)))&"",注意绝对引用的位置:
在这里插入图片描述
解释一下公式,从内往外展开:
IF($A$1:$A$100=I$1,ROW($1:$100),4^8),绝对引用A列的前100行,也就是”班级“列的内容,虽然这里也包含了不需要的表头,但是没关系,并不影响结果。
这部分是一个数组公式,它检查A1:A100中的每一个单元格是否等于I1单元格的值。
如果某个单元格的值与I1相等,则返回该单元格的行号(例如,如果A5等于I1,则返回5)。
如果不相等,则返回4^8(即65536,这是一个远大于100的数字,因此不会影响后续SMALL函数的结果)。

其实公式=row(1)是会报错的,但是上面的公式不会报错。所以为了更清楚的理解和公式的严谨,可以将上面的if()函数写成IF($A$1:$A$100=I$1,ROW($A$1:$A$100),4^8)
SMALL(IF($A$1:$A$100=I$1,ROW($1:$100),4^8),ROW(A1)),用来返回数组中的第k个最小值。
if()函数中返回的是A列的行号或者65536。如果匹配I1则返回的是行号。
本例中,if()函数先判断A1与I1,然后返回65536;再判断A2与I1,然后返回2;再判断A3与I1,返回行号3;判断A4与I1,返回65536;……
也就是if函数返回的(数组)值为{65536,2,3,65536,……}。
因为=INDEX($B:$B,SMALL(IF($A$1:$A$100=I$1,ROW($1:$100),4^8),ROW(A1)))&""是要下拉的,所以row()函数是变动的,会变成row(A1)、row(A2)、row(A3)……row(A100)。
在这里插入图片描述
small()函数是返回数组中第k个最小值,那么就是依次返回第一、第二、第三……个最小值,那么就是返回与I1单元格的值相等的A列值的行号,也就是数组中的2,3,……
INDEX($B:$B,SMALL(IF($A$1:$A$100=I$1,ROW($1:$100),4^8),ROW(A1)))
INDEX函数的基本语法是INDEX(array, row_num, [column_num]),其中Array是必需的参数,表示单元格区域或数组常量。Row_num和Column_num是可选参数,分别表示行号和列号。如下图,再X1到X5单元格区域中,返回第2行的值:
在这里插入图片描述
因此INDEX($B:$B,SMALL(IF($A$1:$A$100=I$1,ROW($1:$100),4^8),ROW(A1)))是返回B列中,与I1单元个的值相等的A列的行号对应的值,也就是B2、B3……
将I2单元格中的公式向右、向下填充,得到结果:
在这里插入图片描述
因为公式的结尾有&"",所以匹配不上的显示为空,而不会显示#N/A等报错信息。

step2 名称管理器

选中有公式的I到S列,向下选中100行(行数根据实际需要)。为了方便演示,我选择了20行。
选中这个区域以后,【公式】-【根据所选内容创建定义的名称】:
在这里插入图片描述
只选择【首行】,单击确定:
在这里插入图片描述
点击上方【名称管理器】,发现已经创建好了名称:
在这里插入图片描述
随便点开一个,就能看到它所对应的名称及单元格区域:
在这里插入图片描述
关闭名称管理器,返回excel编辑界面。

step3 制作二级下拉菜单

选中二级下拉菜单的单元格G2,然后【数据】-【数据验证】-【数据验证(V)】进入数据验证对话框:
在这里插入图片描述
选择【序列】,在来源中输入公式=indirect($F$2),点击确定:
在这里插入图片描述
这时,二级下拉菜单也做好了:
在这里插入图片描述
但是这里有个问题,就是下拉菜单里面有空白。

step4 消除二级菜单中的空白

选中二级菜单项,也就是本例中的G2,再次进入【数据】-【数据验证】-【数据验证(V)】,将【设置】选项卡下【来源】中的公式由刚才的=indirect($F$2)替换为:=OFFSET(INDIRECT($F$2),0,0,MATCH(CHAR(1),INDIRECT($F$2),-1),1)
在这里插入图片描述
尝试解释一下=OFFSET(INDIRECT($F$2),0,0,MATCH(CHAR(1),INDIRECT($F$2),-1),1)的含义:
公式里面,最重要的是MATCH(CHAR(1),INDIRECT($F$2),-1)
MATCH函数用于在范围或数组中查找一个值,并返回其相对位置。具体参数:
在这里插入图片描述
这里的查找范围是INDIRECT($F$2)。在本例中,当F2中的选项是“三班”时,对应的数据范围是名称管理器中指定的N2:N20单元格区域(因为当时选了首行作为名称,所以就不包含在这里了)。
那么,match()函数在这里的意思就是,在N2:N20单元格区域查找返回ASCII值为1的字符,即“SOH”(Start of Header)字符,并返回它的相对位置。MATCH函数的第三个参数-1,是从范围中查找大于或等于char(1)的最小值。可以理解为char(1)是个极小值。大于或等于char(1)的就是N2:N20单元格区域中有值的4项,也就是A9、A10、A12、A16,而其它的单元格都是空白,所以一定是小于char(1)的。这时返回的值就是4,也就是match()函数返回结果4。
=OFFSET(INDIRECT($F$2),0,0,MATCH(CHAR(1),INDIRECT($F$2),-1),1)就是,在F2所代表的区域(N2:N20)中,不偏移的选择4列,也就是有值的值为A9、A10、A12、A16的这四个单元格。因为这是【数据验证】中【来源】里面的公式,所以,下拉菜单将只显示有值的结果,空白的区域就不可见了。
这里挺难理解的,我也是边看边试着去理解。

【总结】

1、首先做辅助数据。先用=OFFSET($D$1,COLUMN(A1)-1,0)&""进行列转行,得到表头。再用=INDEX($B:$B,SMALL(IF($A$1:$A$100=I$1,ROW($1:$100),4^8),ROW(A1)))&""得到表数据。
这个辅助区域的作用是定义名称管理器。
名称管理器的名字就是表头,而一级下拉菜单,也就是F2单元格的内容与名称管理器的名称一致时,二级下拉菜单的序列来源使用公式INDIRECT($F$2),也就是对名称使用了函数indirect(),这个函数指向名称管理器的内容,也就是辅助区域内的数据值。
2、在辅助区域,用名称管理器定义名称。这个定义的名称,与以及下拉菜单的内容一致。
3、利用【数据验证】制作二级下拉菜单,并在【来源】中写入公式=OFFSET(INDIRECT($F$2),0,0,MATCH(CHAR(1),INDIRECT($F$2),-1),1)用以消除二级下拉菜单中的空白选项。
4、每一步的公式都略有点复杂,不太好理解。会用就好了。
模板我上传了,在文章的最上面。
以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么一线大厂都在高薪抢 AI 产品经理?

前言 不知道你是否听过“移动互联网产品经理”这个说法,当移动互联网成为整个互联网行业的基础建设,深入到各行各业,所有产品经理,其实都是移动互联网产品经理。 而近些年,随着 AI 技术逐渐落地和市场认可度的不断提…

公安视频图像信息数据库及GA/T 1400视图库视频监控系统的使用场景

随着科技的快速发展,大数据、人工智能等新技术不断融入各行各业,为各行各业带来了前所未有的变革。在公安领域,GA/T 1400协议公安视频图像信息数据库的应用为视频监控场景提供了强有力的支持,极大地提升了公安工作的效率和准确性。…

C++ XML文件和解析

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它具有自描述性和平台无关性的特点。XML 文档的格式主要由一组嵌套的元素和属性构成,结构清晰,易于理解和解析。 XML 文档的基本格式 一个 XML 文档通常包括以下部分&a…

大模型狂奔不息的300天

大模型行业正如火如荼地发展着,那么,如何解读当前国内大模型行业的发展?谁又可能是大模型时代的超级应用?或许后一个问题的答案,现在还未能揭晓。一起来看看本文关于大模型行业发展的解读和分析。 2023年,没…

Linux线程 -- 互斥锁 和 条件变量

在多线程编程中,互斥量(mutex)是用于保护共享资源的同步机制,确保在任一时刻只有一个线程能够访问共享资源。互斥量用于防止竞态条件(race conditions),确保数据一致性。 基本概念 互斥量&…

python学习笔记-04

高级数据类型 一组按照顺序排列的值称为序列,python中存在三种内置的序列类型:字符串、列表和元组。序列可以支持索引和切片的操作,第一个索引值为0表示从左向右找,第一个索引值为负数表示从右找。 1.字符串操作 1.1 切片 切片…

Unity 编辑器扩展 一键替换指定物体下的所有材质球

先看效果 实现方案 1:创建几个用于测试的Cube 2:创建一个脚本 3:编写脚本内容 主要是这部分的逻辑 附上完整代码 using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class Tool {[MenuItem(…

json文件操作和异常处理

目录 按行读取文件readline() 读取大文件: json文件: json文件介绍: json的语法: 读取json文件: json文件写入: 异常: 捕获异常: 捕获指定类型的异常: 捕获未知类型的异常(使用最多): 异常捕获的完整结构: 异常传递: ​编辑抛出异常: 按行…

A6500-LC LVDT 前置器,用于A6500-UM, 导轨安装

电源 22.5V to 32VDC <30mA <0.1%/V <60V( 使用SELV/PELV 供电电源) 约2.2Vrms,5kHz IP20 IEC 60529 -35C to 75C(-31F to 167F) -35C to 85C(-31F to 185F) 电流损耗 供电电压对 运行温度 存储温度 0.35mm(0.014 in ),10 to 55Hz 15g 根据 EN 60068-2-27 根据IEC 613…

linux必学基础命令大全

一切皆文件&#xff0c;每个文件都有具体的用途 命令快捷查看目录 常用命令 - 目录类1、ls 查看当前目录下的文件2、man查看命令详细信息3、pwd 查看当前目录 -4、cd 进入目录5、清屏命令6、mkdir创建目录7、du查看文件或者文件夹大小 常用命令 - 文件类1、vim/vi使用2、cat 查…

Maven实战: 从工程创建自定义archetype

在上一节中(创建自定义archetype)我们手动创建了一个项目模板&#xff0c;经过5步能创建出一个项目模板&#xff0c;如果我有一个现成的项目&#xff0c;想用这个项目作为模板来生成其他项目呢&#xff1f;Maven提供了基于项目生成archetype模板的能力&#xff0c;我们分3步来讲…

Windows下 CLion中,配置 OpenCV、LibTorch

首先按照win下C部署深度学习模型之clion配置pytorchopencv教程记录 步骤配置。 LibTorch 部分 在测试LibTorch时会出现类似 c10.dll not found 的问题&#xff08;Debug才有&#xff09;&#xff1a; 参考C部署Pytorch&#xff08;Libtorch&#xff09;出现问题、错误汇总和 …

行业分析---造车新势力之理想汽车

1 前言 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 此类文章的受…

vulntarget-b记录(Sliver学习)

网络环境 域控&#xff08;Win2016&#xff09; vulntarget\administrator&#xff1a;Admin123、&#xff08;首次登陆要改密码修改为Admin123&#xff09; vulntarget\win101&#xff1a;admin#123 边界Web主机突破 nmap扫描发现81端口 通过扫描&#xff0c;fuzz出来了后…

DJI FlyCart 30 天空 “吊车”概念板评测!

从消费级无人机&#xff0c;到专业级无人机&#xff0c;再到行业级无人机&#xff0c;大疆的探索脚步从未停下。现在&#xff0c;大疆已经正式进入民用运载无人机行列&#xff01;就在8月16日&#xff0c;大疆正式发布首款民用运载无人机 —— DJI FlyCart 30。 作为大疆第一代…

Flutter基础 -- Flutter基础特性

目录 1. 一切都是 widget 1.1 UI 组件&#xff01;&#xff01;&#xff01; 1.2 架构设计 1.3 sdk 源码目录 1.4 widget 分类&#xff01;&#xff01;&#xff01; 参考文献 2. devTools 调试工具 2.1 启动调试器 2.2 布局面板 参考文献 3. 布局约束规则 3.1 让子…

亲,你有多久没有清理过你电脑的 DNS 缓存了?

最近明月因为工作关系更换了几次使用的电脑,期间就发现明明另一台电脑访问某个网址是正常,换一台电脑后就会出现无法访问的现象,并且用的还是同一个宽带网络,实在是太诡异了!后来还是突然想起来 DNS 缓存这个问题,立马清除了那台电脑的 DNS 缓存后,打不开的网址顺利的呈…

FPGA PCIe PIO代码的学习

目录 背景 应用场景 代码架构分析 结论 背景 本项目是基于xinlinx官方的PCIe IP 7 series integrated block for PCI Express。根据官方的例程加上官方给的example&#xff0c;对代码进行分析。 应用场景 对一些速率要求不高的&#xff0c;比如IO操作&#xff0c;推荐使用…

对新手友好的最简单方便的本地项目关联git远程仓库教程

对新手友好的最简单方便的本地项目关联git远程仓库教程 前置条件1.本地项目2.gitee上创建同名项目 关联操作1.在本地进行clone远程仓库操作2.把本地项目下的目录和文件都复制到这个克隆自git的项目文件夹里面3.查看文件状态和提交文件 在我们创建项目时&#xff0c;一般都是在本…

QAnything-1.4.01.4.1版本更新!使用指北!

久等了各位&#xff01;时隔一个多月&#xff0c;我们在4月26日和5月20日接连发布了v1.4.0和v1.4.1两个版本&#xff0c;带来了问答性能&#xff0c;解析效果等多方面的改进&#xff0c;并新增了大量的新功能和新特性 详见&#xff1a;releases 以及 使用说明 最新特性表 开发…