Function val_lv(arr, Optional lv& = 1)'数据有效性级别函数,arr为数据有效性的数组,lv为级别,返回第lv级的规则数据;arr建议从表格读取'第lv级的内容为便于定义,允许在一个单元格内有多个数据,使用分隔符,默认为","(半角)'代码简易,每级避免出现归属不同上级的同名字符串,会出错Dim dict As Object, delimiter$, i&, j&, temp, high_lv, resultdelimiter = ","    '分隔符,最好为数据中不存在的字符,如Chr(28)或|If LBound(arr) = 0 Then  '转为从1开始计数arr = WorksheetFunction.Transpose(WorksheetFunction.Transpose(arr))End IfIf UBound(arr, 2) < lv Then Debug.Print "级别不能大于数组列数": val_lv = "": Exit FunctionSet dict = CreateObject("scripting.dictionary")If lv = 1 ThenFor i = 1 To UBound(arr)temp = Split(arr(i, lv), delimiter)For Each t In tempdict(t) = ""NextNextresult = Array(Join(dict.keys, ","), "")val_lv = WorksheetFunction.Transpose(result)  'lv=1时,则ubound(val_lv,2)=1ElseIf lv > 1 ThenFor i = 1 To UBound(arr)high_lv = arr(i, lv - 1)  '第lv级的上一级,字典嵌套If Not dict.Exists(high_lv) Then Set dict(high_lv) = CreateObject("scripting.dictionary")temp = Split(arr(i, lv), delimiter)For Each t In tempdict(high_lv)(t) = ""NextNextReDim result(1 To dict.Count, 1 To 2)  '从1开始计数,返回第lv级的上一级和本级For Each k In dict.keysj = j + 1: result(j, 1) = k: result(j, 2) = Join(dict(k).keys, ",")Nextval_lv = result  'lv>1时,则ubound(val_lv,2)=2End If
End FunctionPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)'适用单个单元格选中,多级联动的数据有效性,但上级修改下级不会自动修改Dim arr, brr, args_dict As Object, a&, b$, c&Set args_dict = CreateObject("scripting.dictionary")  '参数字典
'--------------------参数填写:字典(列号)=级别,列号、级别都为数字args_dict(1) = 1: args_dict(2) = 2: args_dict(3) = 3arr = Worksheets("数据有效性").[a2:c7].Value: a = Target.ColumnIf Not args_dict.Exists(a) Then Debug.Print "范围外": Exit SubFor Each k In args_dict.keysIf args_dict(k) = args_dict(a) - 1 Then c = k - a  '当前选中的上级列号的偏移量NextIf args_dict(a) = 1 Then  '第1级brr = val_lv(arr, 1)With Target.Validation.Delete.Add xlValidateList, xlValidAlertStop, xlEqual, Formula1:=brr(1, 1)End WithElseIf args_dict(a) > 1 And Target.Offset(0, c) <> "" Thenbrr = val_lv(arr, args_dict(a))For i = 1 To UBound(brr)If brr(i, 1) = Target.Offset(0, c).Text Then b = brr(i, 2): Exit ForNextWith Target.Validation.Delete.Add xlValidateList, xlValidAlertStop, xlEqual, Formula1:=bEnd WithEnd If
End Sub

使用了工作表事件Worksheet_SelectionChange,单元格选中变化时代码自动运行
可以实现多级联动的数据有效性,但要注意上级修改后下级不会自动修改/清空
仅需定义数据规则,传参给sub过程,再定义参数字典,即可自动运行

数据

数据有效性

仅举例三级联动的数据有效性,实际使用可以更多级数

参考资料
官方文档:《Validation 对象 (Excel)》
其他技术博客,一级数据有效性:《L罗乐-Excel技术 | 数据有效性11:认识Validation对象》
其他技术博客,可以存在归属不同上级的同名数据有效性:《excelhome蓝桥玄霜-3级动态数据有效性设置》

Excel·VBA多级联动的数据有效性相关推荐

  1. 关于使用JavaPOI 导出Excel多级联动的一些方法

    关于使用JavaPOI 导出Excel多级联动 0.记录原因 最近有个需求是需要导出Excel模板,里面有涉及到某些字段只能做下拉选择,有单个下拉也有多级联动的.写了好久,在网上也查了很多资料,但是感 ...

  2. 几张表格怎么联动_如何实现多张excel表格数据联动-Excel 如何实现多级下拉菜单的联动...

    Excel 如何实现多级下拉菜单的联动 excel中份表格实现数据同步的步骤如下: 首先打开计算机,在计算机桌面找到excel软件标左键双击excel的快捷方式以打开软件.然后打开需要进行数据同步的表 ...

  3. php excel多级下拉菜单自动匹配,Excel下拉菜单怎么做 多级联动+自动匹配教程

    Excel一直是近年来办公室工作中的必要软件之一,这个软件功能非常强大,如果你只学会了皮毛那就有些可惜了,而Excel隐藏了许多许多的小技巧.今天UU为大家带来的是Excel下拉菜单怎么做,其中包括多 ...

  4. excel图表交互联动_如何使用高大上的多级联动交互式图表来分析人员结构?

    关注[新精英充电站]能力提升看得见! 众所周知,Excel中的图表是分析数据最重要一枚利器.但一般我们分析数据时使用的图表都是静态的,一个图表只能展示一个数据维度的情况,如果需要展示的数据有多个维度, ...

  5. Excel制作导入模板,多级联动下拉框(一整列的设置),修改一级下拉框内容,自动清空二级内容

    目录 效果展示 一.数据准备 二.模板制作 原因1:为空 原因二:名称管理器数据有误 三.修改一级下拉框内容,自动清空二级内容 1,效果演示 2,实际操作 效果展示 一.数据准备 1,新建一张表,在s ...

  6. 下拉框可筛选多层级菜单多选_用Excel做多级下拉菜单媲美网页筛选器

    用Excel进行数据收集,做好一个数据录入文件给用户使用,结果收回来的数据让你令人抓狂:手机号不是11位 面积单位有人写平方米,有人写m2 张冠李戴,明明写姓名的地方,写了性别 说好写保留一位小数,却 ...

  7. 下拉选择_在管理Excel中实现联动下拉选择

    在系统中常常出现这样的情况:由于下拉选择的数量太多了,难以高效选择.为此管理Excel通过通过引入多级联动选择的方式来减少下拉选择的困难度.先看下使用效果: 联动下拉选择 这个功能,在管理Excel中 ...

  8. excel vba 如何将日期周几转换成文字_Excel 从精通到入门

    Excel 从精通到入门 引子 Excel? 这么简单的东西有学的必要吗?公式加减乘除,诶等等这个日期怎么变成 #### 了,虽然文本数字搞不清楚,但也算熟练使用 Excel 啦. WOW, Awso ...

  9. 来吧!带你玩转 Excel VBA

    来吧!带你玩转 Excel VBA(含CD光盘1张)(双色)(附带近500个VBA思考练习题,Exceltip.net出品) 罗刚君  杨嘉恺编著 ISBN 978-7-121-20627-6 201 ...

最新文章

  1. java i18n 转换,Java的国际化支持(I18N问题)
  2. oracle:更改序列
  3. Leetcode 141.环形链表 (每日一题 20210617)
  4. svn 安装_Tortoise SVN 安装
  5. 分布式Session一致性概述
  6. Java基础学习笔记三 Java基础语法
  7. 小程序 node.js mysql_基于Node.js+MySQL开发的开源微信小程序B2C商城(页面高仿网易严选)...
  8. linux删除第二列为空_Linux之基本文本处理工具(二)
  9. 安装Python第三方库的常用方法和注意事项
  10. MySQL 在指定位置新增字段
  11. 《代码整洁之道》—第1章1.1节要有代码
  12. 【李宏毅2020 ML/DL】P62-65 More about Auto-encoder
  13. 高通增加Adsp log( 三十)
  14. 有需要【JavaScript权威指南第七版、JavaScript高级程序设计第四版】的可以私信我哈
  15. 用JPEXS软件实现swf反编译-逆向调试方法
  16. 程序员又惹祸!B站网站后台工程源码泄露 内含部分用户名密码
  17. 大漠插件ocr多选字库_大漠ocr识别字库的生成,和使用方法
  18. Android Scheme协议与应用全解析
  19. selenium+python自动抢购源码
  20. springboot 之 微服务调用 之 链路追踪

热门文章

  1. 【学习教程】全系统各类型工程水土保持方案编制实践技术系列
  2. 【蓝桥杯省赛真题20】Scratch哆啦A梦竹蜻蜓 少儿编程scratch蓝桥杯省赛真题讲解
  3. 手机版html怎么压缩文件,WPS Office手机版文件怎么压缩 WPS Office手机版文件压缩的方法...
  4. 苏州地铁线路查询接口 地铁线路实时详细信息
  5. 护眼灯哪个牌子好?推荐五款热门颜值高护眼灯
  6. android 获取当前坐标,Android获取位置信息的方法
  7. Spark入门(三)——SparkRDD剖析(面试点)
  8. Python中end=' '的用法
  9. 小米扫地机器人充电座指示灯不亮_小米扫地机器人充电多久可以用 怎么充电?...
  10. code-server在线ide(vistual studio code web online)简介