VBA - Обработка событий из многих Combobox, используя класс - PullRequest
0 голосов
/ 28 ноября 2018

У меня следующая проблема.

Моя программа 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

Буду признателен за любую дополнительную помощь

Заранее спасибо

1 Ответ

0 голосов
/ 28 ноября 2018

Неявные ссылки на элементы по умолчанию снова применяются!

Вам не хватает ключевого слова Set:

Set customBox(IncCBoxes - DBRigaInizioErrori).Box = curCombo

Без ключевого слова Set вы назначаете .Box.Value на LHS, что не может быть правильным.

Но есть еще одна проблема.

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

Это не MSForm.ComboBox элемент управления, это Excel.ComboBox.Вам нужно добавить элемент управления ActiveX, а не «элемент управления формы». Этот ответ охватывает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...