【问题标题】:Create Dictionary for unique value source for Combobox - add another column source为 Combobox 的唯一值源创建字典 - 添加另一个列源
【发布时间】:2021-07-24 15:34:20
【问题描述】:

您好,我有组合框,可以很好地使用以下代码进行过滤:

    Dim rCell As Range

    Set ws = Worksheets("Sheet1")

    With CreateObject("Scripting.Dictionary")
       For Each rCell In ws.Range("N3", ws.Cells(Rows.Count, "N").End(xlUp))
          If Not .Exists(rCell.Value) And Not rCell.Value = "" Then
             .Add rCell.Value, Nothing
          End If
    Next rCell

    ComboBox4.List = .keys
    End With

一切都按预期工作。我现在要做的就是将 K 列添加到我的组合框中的第二列。此列更多,因此用户知道描述。 N 列是项目编号的唯一列表,我的要求只是在组合框的第二列中显示该项目编号的相关描述。这可能吗?

谢谢

【问题讨论】:

  • 请让我了解您的真正需求:您想从 K:K 收集 第一次出现的 N:N(同一行)的对应值乙>?这种理解应该正确吗?您的独特价值观是否在所有出现时都有相同的描述?
  • 每一行都有一个项目 ID 和相应的描述。我刚刚错过了 C 列值为 1 的基本信息,然后取该项目编号和描述。
  • 因此,只有在 C:C 列中存在 1 个值时,才应使用 K:K 中的值。不是唯一键的第一次出现。这种理解正确吗?如果是,这需要一种不同的方法。我可以做到,但是我可以看到您不理解我的代码,并且更喜欢逐项加载组合的变体...
  • 感谢您的支持,老实说我不是程序员。我是一名 PLM 顾问,需要从导出到 excel 的数据中提供解决方案,并使用 VBA 后处理提取的数据。如果您查看我整理的所有代码,您会笑得从座位上掉下来……这令人震惊,但它确实有效,更重要的是,我正在学习 VBA 并真正享受它。我对一些指针和诚实地自己编写代码感到满意,但我感谢您的支持。寻找的是扫描行 C 直到最后,如果你击中一个等于 1 的单元格值,那么显示的值
  • 然后,试试我发布的代码。它应该做你需要的(我理解)......

标签: excel vba loops dictionary filter


【解决方案1】:

请尝试下一个代码:

Sub LoadComboTwoColumnsCond()
  Dim rCell As Range, ws As Worksheet, arr

    Set ws = Worksheets("Sheet1")

    With CreateObject("Scripting.Dictionary")
       For Each rCell In ws.Range("N3", ws.cells(rows.count, "N").End(xlUp))
          If Not .Exists(rCell.value) And rCell.Offset(0, -11).value = 1 And rCell.value <> "" Then
                .Add rCell, rCell.Offset(0, -3).value 'add the K:K correspondent like item value
          End If
      Next rCell
      arr = Application.Transpose(Array(.Keys, .items)) 'create a 2D array with two columns from dictionary keys/items
   End With
    
    With ComboBox4
        .ColumnCount = 2 'set number of columns to be shown
        .list = arr      'put the array in the list property
    End With
End Sub

【讨论】:

    【解决方案2】:

    如果你想要超过 2 列

        Dim i As Long
        ComboBox1.Clear
        With CreateObject("Scripting.Dictionary")
           For Each rCell In ws.Range("N3", ws.Cells(Rows.Count, "N").End(xlUp))
              If Not .Exists(rCell.Value) And Not rCell.Value = "" Then
                 .Add rCell.Value, Nothing
                 ComboBox1.AddItem rCell
                 ComboBox1.List(i, 1) = rCell.Offset(0, -3) 'K
                 'ComboBox1.List(i, 2) = rCell.Offset(0, -2) 'L
                 i = i + 1
              End If
           Next rCell
        End With
    
    Private Sub ComboBox1_Change()
        Dim i As Long
        If ComboBox1.ListCount < 1 Then
            Exit Sub
        Else
            i = ComboBox1.ListIndex
            MsgBox "Selected " & ComboBox1.List(i, 0) & " " & ComboBox1.List(i, 1)
        End If
    End Sub
    

    【讨论】:

    • 非常感谢我一直在努力实现的目标 :-) 现在唯一的问题是,当我选择时,我看到带有描述的唯一项目编号,但是当我从组合框下拉列表中选择一行时,它返回空白的。对不起,厚:-)
    猜你喜欢
    • 2016-10-05
    • 2017-11-18
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多