ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4335|回复: 13

[已解决] 动态下拉菜单的疑问~还请各位高手指点指点,谢谢啦~

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-12-7 23:37 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
下拉菜单.rar (4.46 KB, 下载次数: 29)
无标题1.png


请各位高手指点,谢谢啦~!


TA的精华主题

TA的得分主题

发表于 2013-12-8 00:17 | 显示全部楼层
本帖最后由 zhaogang1960 于 2013-12-8 00:20 编辑

短信收到,请测试:
  1. Dim d As Object

  2. Private Sub Worksheet_Activate()
  3.     Call 设置字典
  4. End Sub

  5. Private Sub Worksheet_Change(ByVal Target As Range)
  6.     If Target.Count > 1 Then Exit Sub
  7.     If Intersect(Target, Range("E2:F65536")) Is Nothing Then Exit Sub
  8.     If d Is Nothing Then Call 设置字典
  9.     If Target.Column = 5 Then
  10.         With Target.Offset(, 1).Validation
  11.             .Delete
  12.             .Add 3, 1, 1, Join(d.keys, ",")
  13.         End With
  14.     ElseIf Target.Column = 6 Then
  15.         With Target.Offset(, 1).Validation
  16.             .Delete
  17.             If d.Exists(Target.Value) Then .Add 3, 1, 1, d(Target.Value)
  18.         End With
  19.     End If
  20. End Sub

  21. Sub 设置字典()
  22.     Dim arr, i&
  23.     Set d = CreateObject("scripting.dictionary")
  24.     arr = Range("A1").CurrentRegion
  25.     For i = 2 To UBound(arr)
  26.         If InStr("," & d(arr(i, 2)), "," & arr(i, 3) & ",") = 0 Then d(arr(i, 2)) = d(arr(i, 2)) & arr(i, 3) & ","
  27.     Next
  28. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-12-8 00:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请注意:此代码仅适应每次输入一个单元格
请看附件
下拉菜单.rar (11.57 KB, 下载次数: 120)

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-8 12:52 | 显示全部楼层
zhaogang1960 发表于 2013-12-8 00:19
请注意:此代码仅适应每次输入一个单元格
请看附件

赵老师威武~但是您写的我看的不是很明白,不是太会改~

开始的时候我是用您很早之前的写的去重复项的一段,见下,红字部分改好了就好了,麻烦您看一下,谢谢~

Private Sub Worksheet_Change(ByVal Target As Range)
    With Target
        If .Row > 1 And .Column < 7 And .Column > 4 Then
            For i = 1 To .Rows.Count
                '初始化 部室、班组 下拉菜单
                If Len(Trim(Cells(.Row + i - 1, 5))) > 0 Then
                    er = Sheet1.Cells(Rows.Count, 2).End(xlUp).Row
                    If er = 1 Then er = 2
                    'BuShiArr = Sheet1.Range("b2:b" & er)
                    BuShiArr = Bcfz(Sheet1.Range("b2:b" & er))
                    BuShiStr = Join(BuShiArr, ",")
                    Cells(.Row + i - 1, 6).Locked = False
                    Cells(.Row + i - 1, 6).Validation.Delete
                    Cells(.Row + i - 1, 6).Validation.Add xlValidateList, Formula1:=BuShiStr
                    Cells(.Row + i - 1, 6).Validation.ShowError = False

                    BanZuArr = Bcfz(Sheet1.Range("b2:c" & er)) '这个地方不会写,求指点
                    BanZuStr = Join(BuShiArr, ",")
                    Cells(.Row + i - 1, 7).Locked = False
                    Cells(.Row + i - 1, 7).Validation.Delete
                    Cells(.Row + i - 1, 7).Validation.Add xlValidateList, Formula1:=BanZuStr
                    Cells(.Row + i - 1, 7).Validation.ShowError = False
                Else
                    Cells(.Row + i - 1, 6).Validation.Delete
                    Cells(.Row + i - 1, 7).Validation.Delete
                End If
            Next
        End If
    End With
End Sub

Function Bcfz(rng As Range)
     Dim d As Object, rCell As Range
     Set d = CreateObject("Scripting.Dictionary")
     On Error Resume Next
     For Each rCell In rng
         If Not d.exists(rCell.Text) Then
             If rCell <> "" Then
                 d.Add rCell.Text, 1
             End If
         End If
     Next rCell
     Bcfz = d.keys
     Set d = Nothing
' 函数用法
' Sub yy1()
' Dim rng As Range                ‘声明变量rng为区域对象
' Set rng = [a1:c10]                ‘把A1到C10单元格区域赋值给变量rng
' [d1].Resize(UBound(Bcfz(rng)) + 1, 1) = Application.Transpose(Bcfz(rng))
' End Sub
End Function
下拉菜单V2.rar (13.72 KB, 下载次数: 34)



TA的精华主题

TA的得分主题

发表于 2013-12-8 13:02 | 显示全部楼层
whatyang 发表于 2013-12-8 12:52
赵老师威武~但是您写的我看的不是很明白,不是太会改~

开始的时候我是用您很早之前的写的去重复项的一 ...

这个程序速度会很慢,不改也罢
请说明你想到达的效果

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-8 13:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 whatyang 于 2013-12-8 13:09 编辑
zhaogang1960 发表于 2013-12-8 13:02
这个程序速度会很慢,不改也罢
请说明你想到达的效果

就是您上面写的,加个多行(因为数据不一定是一个一个格子手工输入的,有可能是一次性粘贴上去的),然后如有数据删除时,数据有效性也清除掉~
(额,不过话说,一次性的运算量不是很大,所以对速度基本无要求~...呵呵~)

TA的精华主题

TA的得分主题

发表于 2013-12-8 13:09 | 显示全部楼层
whatyang 发表于 2013-12-8 13:06
就是您上面写的,加个多行(因为数据不一定是一个一个格子手工输入的,有可能是一次性粘贴上去的),然后 ...

不记得了,可能是08年写的吧,那时还不会用字典,也不知道数组比区域快

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-8 13:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhaogang1960 发表于 2013-12-8 13:09
不记得了,可能是08年写的吧,那时还不会用字典,也不知道数组比区域快

额,我的意思是您刚才上面才写的就是我要的东西,如果再加入 1.多行支持 2.数据删除时有效性随之删除 就完美了~  (您之前写的也是用字典的呀,不过是用区域的,没有用数组)

TA的精华主题

TA的得分主题

发表于 2013-12-8 15:12 | 显示全部楼层
whatyang 发表于 2013-12-8 13:59
额,我的意思是您刚才上面才写的就是我要的东西,如果再加入 1.多行支持 2.数据删除时有效性随之删除 就完 ...
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Intersect(Target, Range("E2:F65536")) Is Nothing Then Exit Sub
  3.     If d Is Nothing Then Call 设置字典
  4.     Dim c As Range
  5.     For Each c In Target
  6.         If c.Column = 5 Then
  7.             With c.Offset(, 1).Validation
  8.                 .Delete
  9.                 If Len(c.Value) Then .Add 3, 1, 1, Join(d.keys, ",") Else c.Offset(, 1) = ""
  10.             End With
  11.         ElseIf c.Column = 6 Then
  12.             With c.Offset(, 1).Validation
  13.                 .Delete
  14.                 If d.Exists(c.Value) Then .Add 3, 1, 1, d(c.Value) Else c.Offset(, 1) = ""
  15.             End With
  16.         End If
  17.     Next
  18. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-12-8 15:40 | 显示全部楼层
请看附件
下拉菜单.rar (12.36 KB, 下载次数: 155)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 10:34 , Processed in 0.042653 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表