ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎样使用VBA给单元格设置数据有效性下拉列表?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-31 10:35 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
怎样使用VBA给单元格设置数据有效性下拉列表?

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-31 11:00 | 显示全部楼层
arr = Sheets("基础信息").Range("A2:B" & Sheets("基础信息").Range("B65536").End(xlUp).Row)
For i = 1 To UBound(arr)
    x = arr(i, 1): y = arr(i, 2)
    If Not d.Exists(x) Then Set d(x) = New Dictionary
    d(x)(y) = ""
Next
If Target.Column = 9 Then
    With Target.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(d.Keys, ",")
    End With
    Target.Offset(0, 2) = ""
Else
    x = Target.Offset(0, -2).Value
    If d.Exists(x) Then
        t = d(x).Keys
        With Target.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=IIf(UBound(t) <> -1, Join(t, ","), t)
        End With
    Else
        Target = ""
    End If
End If

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-31 14:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
182197315 发表于 2018-12-31 11:00
arr = Sheets("基础信息").Range("A2:B" & Sheets("基础信息").Range("B65536").End(xlUp).Row)
For i = 1 ...
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2. arr = Sheets("基础信息").Range("A2:B" & Sheets("基础信息").Range("B65536").End(xlUp).Row)
  3. For i = 1 To UBound(arr)
  4.      x = arr(i, 1): y = arr(i, 2)
  5.      If Not d.Exists(x) Then Set d(x) = New Dictionary
  6.      d(x)(y) = ""
  7. Next
  8. If Target.Column = 9 Then
  9.      With Target.Validation
  10.          .Delete
  11.          .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(d.Keys, ",")
  12.      End With
  13.      Target.Offset(0, 2) = ""
  14. Else
  15.      x = Target.Offset(0, -2).Value
  16.      If d.Exists(x) Then
  17.          t = d(x).Keys
  18.          With Target.Validation
  19.              .Delete
  20.              .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=IIf(UBound(t) <> -1, Join(t, ","), t)
  21.          End With
  22.      Else
  23.          Target = ""
  24.      End If
  25. End If
  26. End Sub
复制代码

是这个样输入代码吗?为什么提示用户定义类型未定义呢?

TA的精华主题

TA的得分主题

发表于 2018-12-31 15:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主自己录制一段宏即可的。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-31 18:58 | 显示全部楼层
liulang0808 发表于 2018-12-31 15:22
楼主自己录制一段宏即可的。。。

这个应该怎么录制?要走什么过程可以告知一下吗?谢谢了

TA的精华主题

TA的得分主题

发表于 2018-12-31 20:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Fanrk 发表于 2018-12-31 18:58
这个应该怎么录制?要走什么过程可以告知一下吗?谢谢了

楼主查询下录制宏的方法就知道了

TA的精华主题

TA的得分主题

发表于 2019-1-1 19:18 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-1-1 23:32 | 显示全部楼层
182197315 发表于 2019-1-1 19:18
楼主没有附件,没办法帮你

怎样使用VBA给单元格设置数据有效性下拉列表.zip (15.77 KB, 下载次数: 241)
这附件可以吗?

TA的精华主题

TA的得分主题

发表于 2019-1-2 19:25 | 显示全部楼层
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Column <> 1 And Target.Column <> 2 Then Exit Sub
Dim i%, arr, x$
Dim d As New Dictionary
arr = Sheets("基础信息").Range("A1:B" & Sheets("基础信息").Range("B65536").End(xlUp).Row)
For i = 1 To UBound(arr)
     x = arr(i, 1): y = arr(i, 2)
     If Not d.Exists(x) Then Set d(x) = New Dictionary
     d(x)(y) = ""
Next
If Target.Column = 1 Then
     With Target.Validation
         .Delete
         .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Join(d.Keys, ",")
     End With
     Target.Offset(0, 1) = ""
Else
     x = Target.Offset(0, -1).Value
     If d.Exists(x) Then
         t = d(x).Keys
         With Target.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=IIf(UBound(t) <> -1, Join(t, ","), t)
         End With
     Else
         Target = ""
     End If
End If
End Sub

TA的精华主题

TA的得分主题

发表于 2019-1-20 17:59 | 显示全部楼层
182197315 发表于 2019-1-2 19:25
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If  ...

出错提示:用户定义类型未定义
请教  d As New Dictionary应引用什么控件?谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 08:25 , Processed in 0.050346 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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