首页 > 解决方案 > 来自组合框的下拉菜单 - 右键单击

问题描述

我有一个 ComboBox,我想显示一个 msgbox,当用户在下拉列表中的特定项目上使用 RightClick 时 - 不选择此项目。可能吗?

它不按我的意愿工作。此 msgbox 仅显示所选项目,但我会从下拉列表级别为每个项目显示此 msgbox,而不选择此项目且不折叠整个下拉列表。

我的代码:

Private Sub ComboBox1_Mousedown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = xlSecondaryButton Then
        Select Case ComboBox1.Value
            Case Is = "1"
                MsgBox "Description of item1"
                ComboBox1.Value = ""
            Case Is = "2"
                MsgBox "Description of item2"
                ComboBox1.Value = ""
            Case Is = "3"
                MsgBox "Description of item2"
                ComboBox1.Value = ""
            Case Else
        End Select
    End If
    End Sub

标签: vba

解决方案


好的,我想我看到了您要实现的目标。

不幸的是,不,组合框不能那样工作。您可以想象使用一些非常复杂的 Win32 消息处理来破解它,但归根结底,ActiveX 控件只能按照设计的方式进行配置,并且组合框的“下拉”部分不会为您正在尝试做的事情触发一个事件。

您的用户也不会期望组合框以这种方式运行 - 因此实现它会引入 UX / 功能可发现性问题。

这感觉很像一个 XY 问题:真正的问题是您希望每个下拉项都有关联的描述,以便用户在选择之前知道他们将要选择的内容。

事实证明,组合框可以本地执行此操作。

我不知道你是如何填充你的组合框的,但是如果你可以将你的数据(包括描述)放在一个二维数组中(如果数据来自工作表,你可以免费获得一个Range),你可以配置组合框在 2 列上显示其项目,如果需要,您甚至可以隐藏对用户无意义的数字代码:

Dim items
ReDim items(1 To 3, 1 To 2)
items(1, 1) = 1
items(1, 2) = "Description for Item 1"
items(2, 1) = 2
items(2, 2) = "Description for Item 2"
items(3, 1) = 3
items(3, 2) = "Description for Item 3"

ComboBox1.List = items
ComboBox1.ColumnCount = 2
'ComboBox1.ColumnWidths = "30,70"
ComboBox1.ColumnWidths = "0,70"

有了ColumnWidths = "0,70"这个:

仅显示描述的用户表单组合框

ColumnWidths = "30,70"你一起得到这个:

显示代码和描述的用户表单组合框

组合框的.Value将是第一列包含的任何内容,即使它是隐藏的:

在组合框中显示选定值的标签


推荐阅读