Обнаружение события в комбинированных списках, добавленных во время выполнения в Excel - PullRequest
1 голос
/ 28 февраля 2012

У меня проблема с моим VBA-скриптом в Excel.В основном я создаю кнопки, которые при нажатии создают набор из двух дополнительных комбинированных списков на одном листе.Эту кнопку можно нажимать непрерывно, чтобы добавлять новые комбинированные списки.

Эти недавно созданные комбинированные списки будут вести себя следующим образом:

  1. Созданный 2 комбинированный список
  2. Combobox1 загрузит некоторый список вКонтрольный лист
  3. Когда выбран элемент в Combobox1, Combobox2 загружает список элементов, которые будут добавлены в Combobox2

Код для добавления кнопки выглядит следующим образом

 Sub Add_Criteria()

       Dim controlNum As Integer
       Dim name1 As String
       Dim name2 As String
       Dim oOle1 As OLEObject
       Dim oOle2 As OLEObject
       Dim uniqueString As String

       Dim cb1 As Object

        controlNum = Sheets("Controls").Range("A16").Value

        'adding Control
        Set oOle1 = Sheets("System").OLEObjects _
            .Add(ClassType:="Forms.ComboBox.1", Left:=10, _
            Top:=75 + (controlNum * 20), Width:=100, Height:=18)
        Set oOle2 = Sheets("System").OLEObjects _
            .Add(ClassType:="Forms.ComboBox.1", Left:=120, _
            Top:=75 + (controlNum * 20), Width:=100, Height:=18)

        'adding properties
        oOle1.Name = "Criteria" & controlNum * 2 - 1
        oOle2.Name = "Criteria" & controlNum * 2

        'adding control var
        Sheets("Controls").Range("A16").Value = controlNum + 1

        With oOle1.Object
           .List = Sheets("Controls").Range("A5:A13").Value
        End With

  End Sub

Вопрос в том, что я не могу обнаружить события на нем.Мне нужно изменить значение, показанное во втором комбинированном окне, созданном при изменении значения в комбинированном окне 1.Я пытался использовать ниже ссылку, и я до сих пор не могу.Может кто-нибудь подсказать мне, как это сделать

Справка (Об этой проблеме уже несколько дней):

http://www.dbforums.com/microsoft-excel/1641165-detecting-click-event-dynamically-created-controls.html (Это для пользовательской формы, я не знаю, почему яне может повторить это в Листе)

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Откройте новую книгу и переименуйте листы 1 и 2 в «Система» и «Элементы управления» соответственно.Откройте редактор VBA и вставьте приведенный выше код в общий модуль.Запустите свой код.Вернуться в Excel.(Alt + F11) Щелкните правой кнопкой мыши вкладку «Системный лист» и выберите «Просмотреть код».Вставьте в модуль следующее:

Sub FillCombo()
  With Sheets("System").Criteria299 'Change the name of the control as needed.
    .AddItem 1
    .AddItem 2
  End With
End Sub

Private Sub Criteria299_Change()
'Example of triggering the Change Event using Select Case
  With Sheets("System")
    Select Case .Criteria299.Value
        Case 1
           .Criteria300 = "Dog"   'Change the name of the control as needed.
        Case 2
          .Criteria300 = "Cat"
    End Select
 End With
End Sub

Посмотрите в Project Explorer, и вы увидите, что код находится в модуле системной таблицы, а не в общем модуле.

Любые процедуры обработки событийэлементы управления, добавленные на лист, должны храниться в модуле этого листа.

Подпрограмма FillCombo может быть помещена в общий модуль, если вы обращаетесь к имени листа с элементом управления, как показано.

0 голосов
/ 28 февраля 2012

Вы можете добавлять события программно.Приведенный ниже код добавляет событие для каждого комбинированного списка

. Эта ссылка из Pearson Программирование. VBA Editor также может быть полезен.

enter image description here

Sub Add_Criteria()

    Dim controlNum As Integer
    Dim name1 As String
    Dim name2 As String
    Dim oOle1 As OLEObject
    Dim oOle2 As OLEObject
    Dim uniqueString As String
    Dim cb1 As Object
    Dim strCode As String
    Dim vbProj As Object
    Dim vbCodeMod As Object

    Set vbProj = ActiveWorkbook.VBProject
    Set vbCodeMod = vbProj.vbcomponents(ActiveSheet.CodeName).codemodule

    controlNum = Sheets("Controls").Range("A16").Value

    'adding Control
    Set oOle1 = Sheets("System").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=10, Top:=75 + (controlNum * 20), Width:=100, Height:=18)
    Set oOle2 = Sheets("System").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=120, Top:=75 + (controlNum * 20), Width:=100, Height:=18)


    vbCodeMod.AddFromString AddEvent(oOle1.Name)
    vbCodeMod.AddFromString AddEvent(oOle2.Name)


    'adding properties
    oOle1.Name = "Criteria" & controlNum * 2 - 1
    oOle2.Name = "Criteria" & controlNum * 2

    'adding control var
    Sheets("Controls").Range("A16").Value = controlNum + 1

    With oOle1.Object
        .List = Sheets("Controls").Range("A5:A13").Value
    End With

End Sub

Function AddEvent(strIn As String) As String
    AddEvent = "Private Sub " & strIn & "_Click()" & Chr(10) & _
              "MsgBox ""Event Added""" & Chr(10) & _
              "End Sub"
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...