设为首页收藏本站

嘻皮客娱乐学习网

 找回密码
 中文注册
搜索
打印 上一主题 下一主题
开启左侧

[OFFICE] 让excel数据有效性序列可以多选

[复制链接]
跳转到指定楼层
楼主
发表于 2019-4-26 17:04:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将代码拷到ThisWorkbook里面。
测试文件: (通用)让数据有效性序列可以多选.xlsm (19.79 KB, 下载次数: 149)




  1. 'Option Explicit                     '强制定义变量类型
  2. Option Compare Text          '可以让 AB=ab 成立,即不区分大小写,如果活省略或是把 TEXT换成 Binary 则区分大小写。
  3. '该格式是对整个工作薄里面所有的表格起作用,所以应拷贝到ThisWorkbook里面。
  4. '如果只想针对一个工作表起作用,拷贝到该工作表,并将下面一句换成 Sub Worksheet_Change(ByVal Target As Range)
  5. Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  6. '让数据有效性序列选择 可以多选,重复选
  7.                 Dim rngDV As Range
  8.                 Dim oldVal As String
  9.                 Dim newVal As String
  10.                 Dim Tpy As Integer

  11.                 If Target.Count > 1 Then GoTo exitHandler

  12.                 On Error Resume Next
  13.                 Tpy = Target.Validation.Type
  14.                 On Error GoTo 0

  15.                 If Tpy <> 3 Then GoTo exitHandler

  16. '-------------------------------------------------------------------------

  17.                  Application.EnableEvents = False

  18.                  newVal = Target.Value             '取得新输入的值。

  19.                 On Error Resume Next
  20.                  Application.Undo                      '撤销刚才的输入,以便把没改前的值取得。
  21.                 On Error GoTo 0

  22.                  oldVal = Target.Value                '取得没改之前的值。
  23.                
  24.                 If oldVal <> "" Then oldarr = Split(oldVal, ",")
  25.                 If newVal <> "" Then newarr = Split(newVal, ",")
  26.                                 
  27.                 Dim Dic
  28.                 Dim d As Integer, w As Integer

  29.                 Set Dic = CreateObject("scripting.dictionary") '创建字典对象
  30.                
  31.                 If IsArray(oldarr) Then
  32.                         For d = 0 To UBound(oldarr) Step 1
  33.                             Dic(oldarr(d)) = ""
  34.                         Next
  35.                 End If
  36.                
  37.                 If IsArray(newarr) Then
  38.                         For w = 0 To UBound(newarr) Step 1
  39.                             Dic(newarr(w)) = ""
  40.                         Next
  41.                 End If
  42.                
  43.                 Rng = Dic.keys '返回字典key的数组
  44.                 Set Dic = Nothing '销毁对象
  45.                
  46.                 n = UBound(Rng)
  47.                
  48.                 If n >= 0 Then
  49.                       hbvar = Join(Rng, ",")
  50.                 End If
  51.                
  52.                 If newVal = "" Then
  53.                      Target.Value = newVal
  54.                 Else
  55.                       Target.Value = hbvar
  56.                 End If
  57.                           
  58. exitHandler:
  59.                 Application.EnableEvents = True
  60. End Sub
复制代码


回复

使用道具 举报

小黑屋|手机版|嘻皮客网 ( 京ICP备10218169号|京公网安备11010802013797  

GMT+8, 2024-5-19 02:31 , Processed in 0.194755 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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