如何自动展开下拉验证列表
Posted
技术标签:
【中文标题】如何自动展开下拉验证列表【英文标题】:How to automatically expand drop-down validation list 【发布时间】:2019-02-28 09:03:45 【问题描述】:SendKeys
有什么替代方法可以自动展开下拉验证列表吗?单击单元格后,我想展开下拉验证列表。我的问题的重点完全是如何避免SendKeys
方法。
这是使用SendKeys
的正常工作解决方案:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If HasValidation(Target) Then
SendKeys "%DOWN"
SendKeys "NUMLOCK", True 'Workaround for Numlock turn off bug
End If
End Sub
Function HasValidation(MyCell As Range) As Boolean
Dim t: t = Null
On Error Resume Next
t = MyCell.Validation.Type
On Error GoTo 0
HasValidation = Not IsNull(t)
End Function
相关链接:HasValidation
函数:https://***.com/a/31346246/1903793NumLock
bug:https://***.com/a/29551913/1903793
上面的代码运行顺利,没有任何障碍。对于广泛报道的问题,我只是对SendKeys
有偏见。我怀疑将此解决方案合并到更大的代码中可能会在未来导致难以捕捉的意外行为。
【问题讨论】:
您现在遇到这个问题了吗?因为我实际上认为这很好:) @AlexdeJong 不,根本没有。它工作顺利。这只是一个谨慎的问题。我偏向于使用 SendKeys。我怀疑这可能会导致未来难以捕捉的问题。 【参考方案1】:您对想要实现的目标的定义留下了一些有待回答的问题,但也许下面的代码会让您走上正确的道路。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Const Trigger As String = "A3:B4" ' modify to suit
Const ValCell As String = "H3" ' modify as required
Dim ValType As Long
If Not Application.Intersect(Target, Range(Trigger)) Is Nothing Then
Application.EnableEvents = False
Range(ValCell).Activate
On Error Resume Next
ValType = ActiveCell.Validation.Type
On Error GoTo 0
If ValType = 3 Then SendKeys "%DOWN"
Application.EnableEvents = True
End If
End Sub
上述过程监控触发器范围A3:B4,您可以根据需要进行调整。如果单击此范围内的一个单元格(它可能是单个单元格范围),则具有验证的单元格中的下拉列表(定义为 ValCell)会展开,前提是它存在。代码通过激活CellVal
单元来实现这一点。
【讨论】:
对不起,这个答案没用。我的问题集中在如何避免SendKeys
而不是如何替换HasValidation
功能。您没有提议替换SendKeys "%DOWN"
。相反,你已经使用了。
回到您的问题并修改它以说出您想要的内容。我的回答扩展了“单击单元格时”的验证下拉菜单。如果这必须使用您似乎一无所知的特定代码来完成,除了它不应该包含SendKeys
,您应该解释为什么这应该是一个要求。
你是绝对正确的。我以为我很清楚。我提炼了我的问题。谢谢!很抱歉误导了你。
“广泛报道的问题”相当于SendKeys
必须在受控环境中使用,并且您不想努力控制自己的环境。很公平,但你为什么不能通过单击下拉箭头来展开下拉菜单呢?您要单击哪个单元格来展开它?你的工作表上有多少个?以上是关于如何自动展开下拉验证列表的主要内容,如果未能解决你的问题,请参考以下文章