Class 组合框更改事件的模块代码
Class Module codes for Change Event of comboboxes
我有一个用户表单,其中我为 7 列放置了 10 行组合框。这意味着我总共有 70 个组合框。为了便于您理解,我将第一个组合框称为 (1,1) for (row,column)。
我想做的是,当用户在第 1 行的任何组合框中输入值时,我希望将这些值复制到第 2 行的相邻组合框中。
例如,如果我在 (1,3) 上 select 值,则相同的值将出现在 (2,3) 上。第 3 和 4 行、第 5 和 6 行等等也是如此。
这是我的 class 模块上的代码 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
我知道 class 模块中的代码是错误的,因为我对此一无所知。
谢谢,
伊兹
在我的演示中,我将 Userform -> FormComboGrid
命名为
以下是您需要的更改:
- 用户表单:Public回调方法
用户表单:Class 级别布尔变量用于防止级联回调
myCommonCbo 必须提升到 Class 级别变量。这使引用在 UserForm_Initialize
完成执行后保持有效。
clsLineCopy
应该有一个 Init
方法用于传递用户窗体实例的引用和正在挂钩的组合框。
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
我有一个用户表单,其中我为 7 列放置了 10 行组合框。这意味着我总共有 70 个组合框。为了便于您理解,我将第一个组合框称为 (1,1) for (row,column)。
我想做的是,当用户在第 1 行的任何组合框中输入值时,我希望将这些值复制到第 2 行的相邻组合框中。
例如,如果我在 (1,3) 上 select 值,则相同的值将出现在 (2,3) 上。第 3 和 4 行、第 5 和 6 行等等也是如此。
这是我的 class 模块上的代码 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
我知道 class 模块中的代码是错误的,因为我对此一无所知。
谢谢, 伊兹
在我的演示中,我将 Userform -> FormComboGrid
以下是您需要的更改:
- 用户表单:Public回调方法
用户表单:Class 级别布尔变量用于防止级联回调
myCommonCbo 必须提升到 Class 级别变量。这使引用在
UserForm_Initialize
完成执行后保持有效。clsLineCopy
应该有一个Init
方法用于传递用户窗体实例的引用和正在挂钩的组合框。
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