【问题标题】:Class Module codes for Change Event of comboboxes组合框更改事件的类模块代码
【发布时间】:2018-10-30 15:56:42
【问题描述】:

我有一个用户表单,其中我为 7 列放置了 10 行组合框。这意味着我总共有 70 个组合框。为了便于理解,我将第一个组合框称为 (1,1) for (row,column)。

我想要做的是,当用户在第 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

我知道我在类模块中的代码是错误的,因为我对此一无所知。

谢谢, 伊兹。

【问题讨论】:

  • 当您使用 mybo.CopymyCbo.Paste 时,没有代码或指示您打算粘贴到哪里。您可能必须告诉每个 clsLineCopy 对象要将数据传输到哪个 clsLineCopy 对象。

标签: excel vba combobox userform


【解决方案1】:

在我的演示中,我将其命名为 Userform -&gt; FormComboGrid

以下是您需要的更改:

  • 用户窗体:公共回调方法
  • Userform:用于防止级联回调的类级布尔变量

  • myCommonCbo 必须提升为 类级别变量。这会在 UserForm_Initialize 完成执行后保持引用有效。

    • clsLineCopy 应该有一个 Init 方法用于传递 Userform 实例和被挂钩的 Combobox 的引用。

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

【讨论】:

  • 我得到“找不到方法或数据成员”并且 VBA 窗口突出显示了 Sub UserForm_initialize 中的 .Init。我所做的是,1)将您的 Option explicit 和 Sub Userform_initialize 复制粘贴到我的用户表单(frmCapacity)中。 2) 将 Public Sub ComboBoxChange 复制粘贴到 clsLineCopy 中。 3)创建新类“FormComboGrid”并粘贴上面的代码。我做错了什么吗?我的用户表单名称是“frmCapacity”,我创建了一个按钮将其加载到我的 excel 中。
  • 您要么没有将 Init 方法添加到 clsLineCopy:Class 中,要么将其设为私有方法。我编辑了我的帖子,因为我的班级标题是倒退的。
  • 好的,现在我可以打开用户表单了。该代码可以将输入复制到下一行,但它不相邻。我在(1,1)上输入值,将值复制到(2,4)。换句话说,我在 ComboBox1 上输入值,该值复制到 ComboBox 11,而不是 (2,1) 即 ComboBox7。那么现在我需要修改代码中的哪个公式?
  • 我的组合是 10 x 7 而不是 7 x 10。在 ComboboxChange 中将 10's 更改为 7's 并将 7 更改为 10
  • 现在已经按预期工作了。感谢您的帮助托马斯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
相关资源
最近更新 更多