【发布时间】: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