VBA Combobox / автоматически генерировать код - PullRequest
0 голосов
/ 10 января 2019

У меня есть вопрос, касающийся выпадающего списка в Excel.

У меня есть лист Excel, который по умолчанию содержит два комбинированных списка, и их число описывается переменной x (по умолчанию x = 2). Каждый комбинированный список написан так, чтобы вести себя определенным образом в подпрограммах, например, у меня есть: private sub ComboBox1_DropButtonClick ().

Тем не менее, иногда мне нужно увеличить количество этих ящиков, изменив значение X. Мне может понадобиться до 10 комбинированных списков. Теперь вопрос заключается в том, можно ли каким-либо образом установить поведение бесконечного числа комбинированных списков (например, в случае DropButtonClick). Я написал код для каждого из этих комбинированных списков, поэтому у меня есть подпрограмма для ComboBox1_DropButtonClick (), ComboBox2_DropButtonClick (), ComboBox3_DropButtonClick () и т. Д. Код немного меняется, но он повторяется. Так что все выглядит довольно глупо, и я ищу более изобретательное решение. Может быть, все эти списки могут быть написаны за один раз? Если есть какой-либо способ сделать это, пожалуйста, поделитесь им со мной.

Спасибо, Войцех.

[править] Местоположение моего кода (выделено серым): Снимок экрана редактора VBA в VBA

1 Ответ

0 голосов
/ 10 января 2019

Вот код для динамического добавления элементов управления в пользовательскую форму Excel и добавления кода позади. Добавленный код заставит отображать MessageBox, когда ComboBox получит KeyDown.

Код несколько прокомментирован, но дайте мне знать, если у вас есть вопросы:)

Option Explicit

Sub CreateFormComboBoxes(NumberOfComboBoxes As Long)
    Dim frm         As Object
    Dim ComboBox    As Object
    Dim Code        As String
    Dim i           As Long

    'Make a blank form called 'UserForm1', or any name you want
    'make sure it has no controls or any code in it
    Set frm = ThisWorkbook.VBProject.VBComponents("UserForm1")

    With frm
        For i = 1 To NumberOfComboBoxes
            Set ComboBox = .designer.Controls.Add("Forms.ComboBox.1")
             'Set the properties of the new controls
             With ComboBox
                .Width = 100
                .Height = 20
                .Top = 20 + ((i - 1) * 40) 'Move the control down
                .Left = 20
                .Visible = True
                .ZOrder (1)
                .Name = "ComboBox" & i
            End With
            'Add your code for each module, you can add different code, by adding a if statement here
            'And write the code depending on the name, index, or something else
            Code = Code & vbNewLine & "Private Sub " & "ComboBox" & i & "_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)" & _
                   vbNewLine & "    MsgBox(""hi"")" & vbNewLine & "End Sub"
        Next

        'Add the code
        .CodeModule.InsertLines 2, Code
    End With

End Sub

'Run this
Sub Example()
    CreateFormComboBoxes 5
End Sub


**Edit**

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

Sub addCombosToExcelSheet(MySheet As Worksheet, NumberOfComboBoxes As Long, StringRangeForDropDown As String)
    Dim i           As Long
    Dim combo       As Shape
    Dim yPosition   As Long
    Dim Module      As Object

    yPosition = 20
    For i = 1 To NumberOfComboBoxes
        yPosition = (i - 1) * 50

        'Create the shape
        Set combo = MySheet.Shapes.AddFormControl(xlDropDown, 20, yPosition, 100, 20)

        ' Range where the values are stored for the dropDown
        combo.ControlFormat.ListFillRange = StringRangeForDropDown
        combo.Name = "Combo" & i
        Code = "Sub Combo" & i & "_Change()" & vbNewLine & _
               "    MsgBox(""hi"")" & vbNewLine & _
               "End Sub"
        'Add the code
        With ThisWorkbook
            'Make sure Module2 Exits and there is no other code present in it
            Set Module = .VBProject.VBComponents("Module2").CodeModule
            Module.AddFromString (Code)
        End With

        'Associate the control with the action, don't include the () at the end!
        combo.OnAction = "'" & ActiveWorkbook.Name & "'!Combo" & i & "_Change"
    Next

End Sub

Sub Example()
    Dim sht As Worksheet: Set sht = ThisWorkbook.Sheets(1)
    addCombosToExcelSheet sht, 10, "Sheet1!$A$1:$A$10"
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...