我有一个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
我知道我在类模块中的代码是错误的,因为我不知道它。
谢谢, 伊茨。
答案 0 :(得分:4)
在我的演示中,我命名为Userform -> 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