创建一个下拉列表框列表,该列表依赖于Excel VBA中的“多选”列

时间:2018-07-19 21:02:19

标签: excel vba excel-vba

我正在创建一个弹出式下拉复选框,该复选框取决于在上一个单元格列中选择的项目。我尝试使用数据验证,但是有2个问题:1.我无法获取复选框选项,它只能是一个简单的下拉菜单,并且2.如果其中有多个项目,则无法使用左单元格列。例如:在下面的示例中,请注意,如果有人在“宠物”下的第一列中选​​择了猫,则假设英国猫的毛发是白色,波斯人的毛发可能是橙色和灰色,那么如果用户同时选择了英国和波斯人的类型,向下的复选框列表中,应该可以选择所有英式和波斯猫皮毛颜色选项,例如下面示例中的最后一行。

Pets    | Types           | Fur Color
_________________________
Cats   | British          | White
Cats   | Persian          | Orange, Gray
Cats   | British, Persian | White, Orange, Gray

理想情况下,我的代码应将“类型”作为输入,并且仅使取决于选择的“类型”的浅色类型可见。诸如通过其他选项附加到预制的列表框或加入2个列表框之类的东西。目前,我正在编写一个代码,其中为每个猫的毛皮颜色设置了单独的列表框,但是我不确定如果用户要选择一种以上类型的猫,则不同列表框的联接将如何工作。 这是我使用的数据验证代码((由于上述原因而无法使用)

 =OFFSET($C$1,MATCH($I$5,$B$2:$B$31,0),0,COUNTIF($B$2:$B$31,$I$5))

这是用于创建弹出列表框(即复选框)的代码。

Option Explicit
Dim fillRng As Range


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Gatewaycode As MSForms.ListBox
    Dim LBobj As OLEObject
    Dim i As Long

    Set LBobj = Me.OLEObjects("Gateway")
    Set Gatewaycode = LBobj.Object

    If Not Intersect(Target, Range("O2:O50")) Is Nothing Then
        Set fillRng = Target
        With LBobj
            .Left = fillRng.Left
            .Top = fillRng.Top
            .Width = fillRng.Width
            .Visible = True
        End With
    Else
        LBobj.Visible = False
        If Not fillRng Is Nothing Then
            fillRng.ClearContents
            With Gatewaycode
                If .ListCount <> 0 Then
                    For i = 0 To .ListCount - 1
                        If fillRng.Value = "" Then
                            If .Selected(i) Then fillRng.Value = .List(i)
                        Else
                            If .Selected(i) Then fillRng.Value = _
                                fillRng.Value & "," & .List(i)
                        End If
                    Next
                End If
                For i = 0 To .ListCount - 1
                    .Selected(i) = False
                Next
            End With
            Set fillRng = Nothing
        End If
    End If
End Sub

我知道这确实很复杂,但是任何帮助都是好的。如果有链接或代码段可以帮助附加或列表框,或仅使长列表的某些部分可见,请告诉我。

0 个答案:

没有答案