Коды модулей класса для события «Изменение» в выпадающих списках - PullRequest
0 голосов
/ 21 мая 2018

У меня есть пользовательская форма, в которую я поместил 10 строк в выпадающих списках для 7 столбцов.А это значит, что я получил всего 70 комбо-боксов.Чтобы облегчить ваше понимание, я буду называть первый комбинированный список как (1,1) для (строка, столбец).

Что я пытаюсь сделать, это когда пользователь вводит значения в любом комбинированном списке в строке 1,Я хочу, чтобы значения копировались в соседний выпадающий список в строке 2.

Например, если я выберу значение в (1,3), то же значение появится в (2,3).То же самое касается строк 3 и 4, строк 5 и 6 и т. Д.

Это код моего модуля класса clsLineCopy :

Public WithEvents myCbo As msForms.ComboBox

Private Sub myCbo_Change()
    Dim i As Integer

    'MsgBox "Combo Box " & myCbo.Value & " has changed"
    If myCbo.Value <> "" Then
        myCbo.Copy
        myCbo.Paste
    End If
End Sub

Вот мой код на моей userform_initialize:

Dim myCommonCbo As New Collection
Dim cbo As clsLineCopy
For i = 1 To 70
    Set cbo = New clsLineCopy
    Set cbo.myCbo = Me.Controls("ComboBox" & i)
    myCommonCbo.Add Item:=cbo
Next i
Set cbo = Nothing

Я знаю, что мой код в модуле класса неверен, так как я понятия не имею об этом.

Спасибо, Изз.

1 Ответ

0 голосов
/ 21 мая 2018

В моей демонстрации я назвал Userform -> FormComboGrid

Вот изменения, которые вам нужны:

  • Форма пользователя: метод Public CallBack
  • Форма пользователя:Булева переменная уровня класса, используемая для предотвращения каскадирования CallBacks

  • myCommonCbo должна быть повышена до Переменная уровня класса .Это сохраняет ссылки действительными после того, как UserForm_Initialize завершает выполнение.

    • clsLineCopy должен иметь метод Init, используемый для передачи ссылки на экземпляр Userform и Combobox, который перехватывается.

enter image description here

FormComboGrid:Class

Option Explicit
Private myCommonCbo  As New Collection
Private ComboBoxEventEnabled As Boolean

Private Sub UserForm_Initialize()
    Dim i As Long
    Dim cbo As clsLineCopy
    For i = 1 To 70
        Set cbo = New clsLineCopy
        cbo.Init Me, Me.Controls("ComboBox" & i)
        myCommonCbo.Add Item:=cbo
       ' Me.Controls("ComboBox" & i).List = Array(1, 2, 3, 4, 5, 6, 7)
    Next i

    ComboBoxEventEnabled = True
End Sub

Public Sub ComboboxChange(cbo As MSForms.ComboBox)
    If Not ComboBoxEventEnabled Then Exit Sub
    ComboBoxEventEnabled = False

    Dim index As Long, r As Long, c As Long
    Dim myCbo As MSForms.ComboBox
    index = Replace(cbo.Name, "ComboBox", "")
    c = index Mod 10
    r = Int(index / 10) + 1
    If r = 7 Then Exit Sub

    index = ((r * 10) + c)
    Set myCbo = Me.Controls("ComboBox" & index)
    myCbo.Value = cbo.Value

    ComboBoxEventEnabled = True
End Sub

clsLineCopy:Class

Option Explicit

Private WithEvents myCbo As MSForms.ComboBox
Private mForm As FormComboGrid

Private Sub myCbo_Change()
    mForm.ComboboxChange myCbo
End Sub

Public Sub Init(Form As FormComboGrid, cbo As MSForms.ComboBox)
    Set mForm = Form
    Set myCbo = cbo
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...