首页 > 解决方案 > 如何根据 excel vba 中的组合框 1 填充组合框 2?

问题描述

在 Excel 中,

我有两列,一列包含城市名称,另一列包含员工姓名。每个城市可以有多名员工。

第 1 列 第 2 列

孟买拉吉夏尔马
新德里安基塔
加尔各答
孟买拉胡尔
孟买阿德什
加尔各答大茴香
钦奈 M. 斯瓦米

在用户 form1 中,我有两个组合框。

在组合框 1 中,我想从第 1 列填充唯一的城市名称(孟买、新德里、加尔各答、钦奈),在组合框 2 中,我想要所有各自的员工。

组合框1 组合框2

孟买拉吉夏尔马
孟买拉胡尔
孟买阿德什

我怎样才能做到这一点?

标签: excelvba

解决方案


请尝试下一个代码。Sub可以在 userForm 事件期间调用(Initialize我将向您展示如何),也可以从按钮Click事件中调用。它使用cbCitycbPeople组合框。请用您使用的名称更改他们的名称

  1. 能够加载“cbCity”组合的代码:
Private Sub testPopulateCombo1()
 Dim sh As Worksheet, LastRow As Long, arr As Variant, El As Variant, j As Long
  Dim arrC As Variant, i As Long, k As Long, boolFound As Boolean
 
  Set sh = ActiveSheet 'use here yor sheet
   LastRow = sh.Range("A" & Rows.count).End(xlUp).Row
   
   arr = sh.Range("A2:A" & LastRow).Value
   ReDim arrC(UBound(arr) - 1)
   'Fill the city names:
   For i = 1 To UBound(arr)
        For Each El In arrC
            If El = "" Then Exit For
            If El = arr(i, 1) Then boolFound = True: Exit For
        Next
        If Not boolFound Then arrC(k) = arr(i, 1): k = k + 1
        boolFound = False
   Next i
   ReDim Preserve arrC(k - 1)
   Me.cbCity.List = WorksheetFunction.Transpose(arrC)
   Me.cbCity.ListIndex = 0 'load the first item in the combo
End Sub
  1. 它可以从 UserFormInitialize事件中调用,以这种简单的方式:
Private Sub UserForm_Initialize()
  testPopulateCombo1
End Sub
  1. 为了填充cbPeople组合,当cvCity改变它的值时,你必须使用它的Change事件。双击组合,从右上角选择Change并粘贴下一个代码(在它上面):
Private Sub cbCity_Change()
  Dim sh As Worksheet, arrP As Variant, i As Long
  
  Set sh = ActiveSheet
   arrP = sh.Range("A2:B" & sh.Range("B" & Rows.count).End(xlUp).Row).Value
   Me.cbPeople.Clear
   For i = 1 To UBound(arrP)
    If arrP(i, 1) = Me.cbCity.Value Then
        Me.cbPeople.AddItem arrP(i, 2)
    End If
   Next
   If Me.cbPeople.ListCount > 0 Then Me.cbPeople.ListIndex = 0
End Sub

如果您不使用我使用的组合名称,请根据您的名称进行调整

Initialize事件期间,第一个组合被加载,它的第一个元素 ( .ListIndex = 0) 将被显示。然后,在每次更改cbCity组合后,将加载适当的人名cbPeople

请测试它并发送一些反馈。但是,如果可能的话,不是明天甚至更晚……


推荐阅读