У меня следующая проблема.
Моя программа 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
Буду признателен за любую дополнительную помощь
Заранее спасибо