用于组合框更改事件的类模块代码

时间:2018-05-21 02:40:49

标签: excel vba combobox userform

我有一个userform,我为7列放了10行组合框。这意味着我总共得到了70个组合框。为了便于理解,我将第一个组合框称为(行,列)的(1,1)。

我想做的是,当用户在第1行的任何组合框上输入值时,我希望将值复制到第2行的相邻组合框中。

例如,如果我选择(1,3)上的值,则相同的值将出现在(2,3)上。第3行和第3行也是如此。 4,第5行& 6,等等。

这是我的类模块 clsLineCopy

上的代码
functions:
  getitems:
  handler: lambda.handler
  events:
    - http:
        path: item/store/{storeid}/{itemstatus?}
        method: get
        cors: true

这是我在userform_initialize上的代码:

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

我知道我在类模块中的代码是错误的,因为我不知道它。

谢谢, 伊茨。

1 个答案:

答案 0 :(得分:4)

在我的演示中,我命名为Userform -> FormComboGrid

以下是您需要的更改:

  • Userform:Public CallBack方法
  • Userform:用于防止级联回调的类级布尔变量

  • 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