excel - 组合框更改事件的类模块代码
问题描述
我有一个用户表单,其中我为 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
我知道我在类模块中的代码是错误的,因为我对此一无所知。
谢谢,伊兹。
解决方案
在我的演示中,我将Userform -> FormComboGrid
以下是您需要的更改:
- 用户窗体:公共回调方法
Userform:用于防止级联回调的类级布尔变量
myCommonCbo 必须提升为Class Level Variable。这使引用在
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
推荐阅读
- c# - 我可以在 ASP 网络核心中返回 504 HTTP 代码吗
- sql - 从语句中执行 select * into 返回错误
- python - 仅获取 Pandas groupby 中组的匹配行
- javascript - 如何将 FlowJS 注释应用于 Sequelize 模型?
- algorithm - minimax 和/或 alpha-beta 搜索如何帮助玩游戏?
- r - aggregate.data.frame(as.data.frame(x), ...) 中的错误:参数必须具有相同的长度
- google-apps-script - 尝试为通过表单“文件上传”部分上传的文件设置“任何有链接的人都可以查看”的权限
- ruby - 访问浏览器打印弹出窗口以进行测试
- javascript - 需要 VueJS Getter 仅将最后一个 JSON 属性的所有值作为数组返回
- django - 可以在 Django 中自定义模型包路径