用VBA代码轻松控制下拉列表
本技巧的目的:掌握创建数据有效性,判断是否存在数据有效性,根据当前选择和数据创建动态数据有效性。
如下图的动态数据有效性:
1. 使用代码助手
代码助手下载地址 http://excel880.com/blog/archives/11297
使用代码助手,输入中文:数据有效性 + 空格, 可以弹出选择框,选择需要的代码,实现代码的快速输入。
代码助手可以随时收录需要的代码,方便下次使用。
2. 创建数据有效性的方法
通过录制宏可以得到基础代码:
注释:
Validation: 数据有效性
Delete: 删除
Add: 添加数据有效性验证
Type必选有效性验证类型:
xlValidateCustom:必需有 Formula1: 必须有一个表达式,忽略 Formula2。数据项有效时 True,数据项无效时 False
xlInputOnly: 使用 AlertStyle、Formula1 或 Formula2。
xlValidateList: 必需有Formula1: 必须包含以逗号分隔的值列表,或对该列表的工作表引用。忽略 Formula2
xlValidateWholeNumber、xlValidateDate、xlValidateDecimal、xlValidateTextLength 或 xlValidateTime
必须指定 Formula1 或 Formula2 之一,或两者均指定。
AlertStyle可选有效性验证警告的样式。
xlValidAlertInformation:信息图标为标题的样式
xlValidAlertStop:停止图标为标题的样式
xlValidAlertWarning:警告图标为标题的样式
Operator可选数据有效性验证运算符
Formula1可选数据有效性验证等式中的第一部分。
Formula2可选当 Operator 为 xlBetween 或 xlNotBetween 时,数据有效性验证等式的第二部分(其他情况下,此参数被忽略)。
IgnoreBlank:数据有效性检验是否允许空值,允许: True 不允许:False
InCellDropdown:是否含取值的下拉列表,是:True 否:False
InputTitle:设置数据有效性输入对话框的标题
ErrorTitle:设置数据有效性错误对话框的标题
InputMessage:设置数据有效性检验输入信息
ErrorMessage:设置数据有效性检验错误消息
IMEMode:设置日文输入规则的说明
ShowInput在数据有效性检查区域内选定了某一单元格时,显示数据有效性检查输入消息,为 True
ShowError输入无效数据时显示数据有效性检查错误消息,为 True
修改代码为:
With [A1:A10].Validation '设置 A1:A10的数据有效性
.Delete '删除原来的
.Add Type:=xlValidateList, Formula1:="1,2,3,4" '值列表类型,值:1,2,3,4
End With
设置后:
3. 判断单元格是否存在数据有效性的方法
注释:
type: 返回以下值,它代表区域的数据类型有效性验证。
On Error Resume Next '出现空值时会发生错误,加忽略错误语句
执行后:
检查 A11 单元格 结果:
检查 A2 单元格:
Sub 判断是否存在有效性()
Dim rng As Range
Set rng = [A2]
If 有效性判断(rng) Then '含有效性时
MsgBox "单元格" & rng.Address(0, 0) & ":存在有效性" '执行存在的代码
Else '不含有效性时
MsgBox "单元格" & rng.Address(0, 0) & ":不存在有效性" '执行不存在的代码
End If
End Sub
Function 有效性判断(r As Range)
Dim s
On Error Resume Next '忽略空值错误
s = r.Validation.Type '数据有效性返回值
If s <> "" Then '值不为空时
有效性判断 = True '有数据有效性设置
Else '值为空时
有效性判断 = False '无数据有效性设置
End If
End Function
★★★注意:安装代码助手后,双击 TAB 可以实现自动排版功能,再也不用去手动对齐代码。
结果:
4. 根据当前选择和数据创建动态数据有效性的方法
建立动态数据有效性需要用到二个事件:
SelectionChange 当工作表上的选定区域发生改变时, Change 当用户更改工作表中的单元格
事件中还使用了模块中的函数,方便事件的调试。
注释:
If InStr(strlist, rng.Value) = 0 Then '当传入的列表值参数与原有单元格的值不相符时
rng = "" '原有单元格值置空
End If
If rng = "" Then '如果原有单元格为空时
rng.Select '选中单元格
Application.SendKeys "%{down}" '发送弹出列表框的指令
End If
在语句打断点调试该过程:
原来 A4 值为: 显示器 B4 值为: 显示器对应的 飞利浦15
当 A4 值 改变为: 主机时, 断点启动
代码进入子函数过程: 添加2级数据有效性X Target.Offset(0, 1), "Z286,Z386,Z486,Z586"
传入的列表值参数与原有单元格的值不相符, B4 单元格 置空
选中 B4 单元格, 发送弹出列表框的指令
动态数据有效性建立完毕