VBA Userform中DTPicker与单元格双向批量同步实现问询
解决方案
一、批量赋值逻辑实现
代码
Dim i As Integer ' 以下示例默认DTPicker1对应B2、DTPicker2对应B3……DTPicker20对应B21,可根据你的实际映射规则调整 For i = 1 To 20 With Me.Controls("DTPicker" & i) .Value = Sheets("FirstName").Range("B" & i + 1).Value .CustomFormat = "dd/MM/yyyy" End With Next i
放置位置
放在跳转多页窗体的按钮点击事件中即可,如果你希望窗体打开时就完成赋值,也可以放在UserForm_Initialize事件里。
如果控件和单元格的映射不是连续B列,可以提前定义地址数组读取:
' 按顺序填入20个DTPicker对应的单元格地址 Dim cellArr As Variant cellArr = Array("B2", "C4", "D6", "E2"...) ' 补全剩余17个地址 For i = 1 To 20 With Me.Controls("DTPicker" & i) .Value = Sheets("FirstName").Range(cellArr(i-1)).Value .CustomFormat = "dd/MM/yyyy" End With Next i
二、批量绑定Change事件(无需逐个编写事件代码)
需要借助类模块实现统一事件绑定,步骤如下:
- 打开VBA编辑器,点击「插入」-「类模块」,在属性窗口将类模块的
(名称)属性改为clsDTPHandler - 在
clsDTPHandler类模块中输入以下代码:
' 声明带事件的DTPicker对象 Public WithEvents DTP As DTPicker ' 存储控件对应的绑定单元格地址 Public LinkedCell As String ' 所有DTPicker共用的Change事件逻辑 Private Sub DTP_Change() Sheets("FirstName").Range(LinkedCell).Value = DTP.Value End Sub
- 回到你的UserForm代码窗口,在所有过程的顶部(通用声明区域)添加如下声明:
' 存储所有绑定了事件的DTP类实例,需声明为模块级变量 Dim DTPGroup() As clsDTPHandler
- 在刚才的批量赋值代码后追加事件绑定逻辑,也可以放在
UserForm_Initialize事件中:
ReDim DTPGroup(1 To 20) Dim i As Integer ' 映射规则和批量赋值保持一致即可,以下为连续B列示例 For i = 1 To 20 Set DTPGroup(i) = New clsDTPHandler Set DTPGroup(i).DTP = Me.Controls("DTPicker" & i) DTPGroup(i).LinkedCell = "B" & i + 1 Next i
如果用自定义地址数组,将赋值语句改为DTPGroup(i).LinkedCell = cellArr(i-1)即可。
内容的提问来源于stack exchange,提问作者Drawleeh
相关产品推荐
相关产品推荐

