【问题标题】:How to create Sub on dynamically created ComboBox in VBA?如何在 VBA 中动态创建的 ComboBox 上创建 Sub?
【发布时间】:2016-09-18 08:06:52
【问题描述】:

我对 excel 编程和 VBA 非常陌生。我被困在我有随机数量的动态创建的组合框(ComboBox1,ComboBox2 .... ComboBoxN)。 我需要实现一个功能,如果我在 ComboBox[i] 中选择一个值(其中 i 可以是 1 到 N 之间的任何随机数),那么它应该触发一个事件,该事件将填充 ComboBox[i+1] 中的值。

我该如何为此编写一个 Sub?如果不在 Sub 中,还有其他方法可以实现吗?

【问题讨论】:

  • 组合框是工作表还是用户表单?
  • ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _ Link:=False, DisplayAsIcon:=False, Left:=50, Top:=TopD, Width:=100 , _ 高度:=15) @ThomasInzina

标签: vba excel combobox


【解决方案1】:

为了创建一个组事件,您需要一个自定义类来捕获事件(ObjectListener)、一个公共变量来保持类引用的活动(通常是一个集合或数组 - ComboListener)和一个宏填写集合(AddListeners_ComboBoxes)。

Workbook_Open() 调用AddListeners_ComboBoxes 宏。如果代码中断,您将需要再次致电AddListeners_ComboBoxes

标准模块

Public ComboListener As Collection

Sub AddListeners_ComboBoxes()
    Dim ws As Worksheet
    Dim obj As OLEObject
    Dim listener As ObjectListener

    Set ComboListener = New Collection

    For Each ws In Worksheets
        For Each obj In ws.OLEObjects
            Select Case TypeName(obj.Object)
            Case "ComboBox"
                Set listener = New ObjectListener
                Set listener.Combo = obj.Object

                ComboListener.Add listener
            End Select
        Next
    Next
End Sub

类对象监听器

Option Explicit

Public WithEvents Combo As MSForms.ComboBox

Private Sub Combo_Change()
    MsgBox Combo.Name
    Select Case Combo.Name
        Case "ComboBox2"
        ActiveSheet.OLEObjects("ComboBox3").Object.ListIndex = 1

    End Select

End Sub

【讨论】:

    【解决方案2】:

    作为 Thomas Inzina 展示的“类”方法的替代方案,这里有一种“结构较少”的方法:

    Private Sub ComboBox1_Change()
        PopulateCombo 2
    End Sub
    
    Private Sub ComboBox2_Change()
        PopulateCombo 3
    End Sub
    
    Private Sub ComboBox3_Change()
        PopulateCombo 4
    End Sub
    
    Private Sub ComboBox4_Change()
        PopulateCombo 1 '<--| will "last" combobox populate the "first" one?
    End Sub
    
    Private Sub PopulateCombo(cbNr As Long)
        With ActiveSheet.OLEObjects("ComboBox" & cbNr) '<--| reference the combobox as per the passed number
            .ListFillRange = "Sheet1!J1:J10" '<--| populate it with "Sheet1" worksheet range "A1:A10"
            .Object.ListIndex = 1 '<--| select its first item
        End With
    End Sub
    

    【讨论】:

    • @Vikram,你通过了吗?
    • 好吧,要么接受其中一个答案,要么告诉回答者为什么他们没有证明有用
    • 你可以。只有upvoting需要15reps
    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2014-02-24
    • 2015-09-20
    • 1970-01-01
    相关资源
    最近更新 更多