【问题标题】:VBA - Handling Events from many Comboboxes, using classVBA - 使用类处理来自许多组合框的事件
【发布时间】:2019-04-30 15:36:33
【问题描述】:

我有以下问题。

我的 VBA 程序按照我的预期生成了许多组合框。

当我尝试处理他们的更改事件时,问题就来了。在网上搜索我发现在这些情况下需要一个类模块,所以我就是这样做的。

这是我的类模块代码(类名:DB_ComboBox)

    Private WithEvents DB_ComboBoxEvents As MSForms.ComboBox
    Private DB_ComboBox_Line As Integer

    Private Sub DB_ComboBoxEvents_Change()
        MsgBox ("Line : " & DB_ComboBox_Line)
        'Here I will handle The comboboxes changes
    End Sub

    Public Property Let Box(value As MSForms.ComboBox)
        Set DB_ComboBoxEvents = value
    End Property
    Public Property Get Box() As MSForms.ComboBox
        Set Box = DB_ComboBoxEvents
    End Property


    Public Property Let Line(value As Integer)
        DB_ComboBox_Line = value
    End Property

    Public Property Get Line() As Integer
        Line = DB_ComboBox_Line
    End Property

这里是我生成组合框的(简化的)代码部分。如您所见,我正在尝试将所有组合框插入数组“customBox()”

Option Explicit

Private customBox() As New DB_ComboBox

Dim G_DBRigaInizioErrori As Integer
Dim G_IncBoxes As Integer

G_DBRigaInizioErrori = 5

For G_IncBoxes = G_DBRigaInizioErrori To 10
    CreateComboBox G_DBRigaInizioErrori, G_IncBoxes
Next


Sub CreateComboBox(DBRigaInizioErrori, IncCBoxes)

    Dim curCombo As Object
    Dim ws As Worksheet
    Dim rng As Range


    ReDim Preserve customBox(IncCBoxes - DBRigaInizioErrori)


    Set ws = ActiveSheet

    With ws

        Set rng = .Range("J" & IncCBoxes)


        Set curCombo = .Shapes.AddFormControl(xlDropDown, _
                                          Left:=rng.Left, _
                                          Top:=rng.Top, _
                                          Width:=rng.Width, _
                                          Height:=rng.Height)


        With curCombo

            .ControlFormat.AddItem "1", 1
            .name = "myCombo" & IncCBoxes

        End With

        Set customBox(IncCBoxes - DBRigaInizioErrori) = New DB_ComboBox
        customBox(IncCBoxes - DBRigaInizioErrori).Box = curCombo
        customBox(IncCBoxes - DBRigaInizioErrori).Line = IncCBoxes


    End With
End Sub

当我运行它时,我在以下行收到错误“13”(不是相应的类型):

    customBox(IncCBoxes - DBRigaInizioErrori).Box = curCombo

我该如何解决这个问题?

提前谢谢你

编辑

根据建议,我做了以下更改:

1) 类模块

        Private WithEvents DB_ComboBoxEvents As Excel.OLEObject
    Private DB_ComboBox_Line As Integer

    Private Sub DB_ComboBoxEvents_Change()
        MsgBox ("Line : " & DB_ComboBox_Line)
        'Here I will handle The comboboxes changes
    End Sub

    Public Property Let Box(value As Excel.OLEObject)
        Set DB_ComboBoxEvents = value
    End Property
    Public Property Get Box() As Excel.OLEObject
        Set Box = DB_ComboBoxEvents
    End Property


    Public Property Let Line(value As Integer)
        DB_ComboBox_Line = value
    End Property

    Public Property Get Line() As Integer
        Line = DB_ComboBox_Line
    End Property

(我不确定“Excel OLEObject”,但编译器没有抱怨,所以我猜它与“WIthEvents”兼容)

“主”模块:

    Option Explicit

    Private customBox() As New DB_ComboBox

    Dim G_DBRigaInizioErrori As Integer
    Dim G_IncBoxes As Integer

    G_DBRigaInizioErrori = 5

    For G_IncBoxes = G_DBRigaInizioErrori To 10
        CreateComboBox G_DBRigaInizioErrori, G_IncBoxes
    Next


    Sub CreateComboBox(DBRigaInizioErrori, IncCBoxes)

        Dim curCombo As Object
        Dim rng As Range
        Dim tot_items As Integer
        Dim incAddItem As Integer

        ReDim Preserve customBox(IncCBoxes - DBRigaInizioErrori)


        tot_items = 5

        Set rng = ActiveSheet.Range("J" & IncCBoxes)
        Set curCombo = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, Left:=rng.Left, Top:=rng.Top, Width:=rng.Width, Height:=rng.Height).Object


        For incAddItem = 1 To tot_items
            curCombo.AddItem "Hi"
        Next

        Set customBox(IncCBoxes - DBRigaInizioErrori) = New DB_ComboBox
        Set customBox(IncCBoxes - DBRigaInizioErrori).Box = curCombo
        customBox(IncCBoxes - DBRigaInizioErrori).Line = IncCBoxes


    End Sub

当我运行它时,我设法创建了第一个 ComboBox(连同它的项目),但随后我收到错误“91”--> 我验证执行在以下行停止

Set customBox(IncCBoxes - DBRigaInizioErrori).Box = curCombo

任何进一步的帮助将不胜感激

提前谢谢你

【问题讨论】:

  • Private customBox() As New DB_ComboBox 是相当可疑的,并且具有良好的内存泄漏的所有成分。将As New 放在那里。为什么不直接使用Collection
  • +您添加了一个下拉列表(表单控件)而不是 ActiveX 控件

标签: excel vba class events combobox


【解决方案1】:

隐式默认成员引用再次出现!

您缺少Set 关键字:

Set customBox(IncCBoxes - DBRigaInizioErrori).Box = curCombo

如果没有 Set 关键字,您在 LHS 上分配的是 .Box.Value,这是不对的。

但是还有另一个问题。

    Set curCombo = .Shapes.AddFormControl(xlDropDown, _
                                      Left:=rng.Left, _
                                      Top:=rng.Top, _
                                      Width:=rng.Width, _
                                      Height:=rng.Height)

这不是MSForm.ComboBox 控件,而是Excel.ComboBox。您需要添加一个 ActiveX 控件,而不是“表单控件”。 This answer 覆盖它。

【讨论】:

  • 谢谢,我修改了我的代码,但我仍然有一些问题,如您所见。关于使用集合而不是数组,如果有必要,我肯定会更改它,但首先我想确保剩余的代码正常工作(我对 VBA 的经验非常有限,我对 VBA 集合的经验是空的迄今为止)。还要感谢@EvR
  • 对于对象属性,你需要一个Property Set;属性Let 用于值分配,而不是对象。还将类型更改回MSForm.ComboBox,因为您将其设置为OleObject.Object,这是一个msforms 组合框。
  • 谢谢马修,它现在可以工作了。谢谢你的精彩解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
相关资源
最近更新 更多