VBA Userform Multipage控件中按编号成对遍历文本框问题
解决VBA UserForm Multipage中文本框成对处理的问题
原代码的问题在于逐个遍历控件,导致同编号的WorkN和CompletedN文本框被分开处理,无法同时获取一对的数值。我们可以直接按编号循环(1到20),主动定位每对文本框,实现成对处理的需求。
修改后的代码
Private Sub CheckBtn_Click() Dim targetPage As MSForms.Page Dim taskName As String Dim workValue As String, completedValue As String Dim taskNum As Integer ' 锁定Multipage的第1页(索引为0) Set targetPage = Me.MP1.Pages(0) Me.MP1.Value = 0 ' 切换到目标页 ' 遍历1到20号任务对 For taskNum = 1 To 20 ' 根据编号匹配任务名称 Select Case taskNum Case 1: taskName = "Emails" Case 2: taskName = "New" Case 3: taskName = "Phone" ' 在此补充4到20对应的任务名称,比如: ' Case 4: taskName = "Report" ' ... Case Else: taskName = "任务 " & taskNum ' 未定义任务时用默认名称 End Select ' 初始化值为空 workValue = "" completedValue = "" ' 获取WorkN文本框的有效数值 On Error Resume Next ' 捕获控件不存在的错误 With targetPage.Controls("Work" & taskNum) If .Text <> "" And .Value <> 0 Then workValue = "完成量: " & .Value End If End With On Error GoTo 0 ' 恢复错误捕获 ' 获取CompletedN文本框的有效数值 On Error Resume Next With targetPage.Controls("Completed" & taskNum) If .Text <> "" And .Value <> 0 Then completedValue = "已完成: " & .Value End If End With On Error GoTo 0 ' 只要有一个有效数值就显示结果 If workValue <> "" Or completedValue <> "" Then MsgBox taskName & vbCrLf & workValue & vbCrLf & completedValue End If Next taskNum End Sub
关键改进点
- 按编号成对定位:直接通过
"Work" & taskNum和"Completed" & taskNum定位同编号的文本框,避免逐个遍历的混乱。 - 清晰的任务名称映射:用
Select Case替代大量ElseIf,后续扩展20个任务时更易维护。 - 容错处理:用
On Error Resume Next处理控件不存在的情况,避免代码报错。 - 统一显示结果:每对文本框的数值收集完成后再统一弹出提示,符合“成对显示”的需求。
内容的提问来源于stack exchange,提问作者New2Programming
相关产品推荐
相关产品推荐

