我是 VBA 新手,最近为 UserForms 编写了一段代码。我必须编写一个点击事件的所有 5 个实例,它们彼此相似,但我不知道如何简化它们,所以我只能为每个点击事件调用一个私有子实例。这是代码:
我完全迷失了,任何学习如何做到这一点的帮助都会很棒。谢谢!
Private Sub chkAddleave1_Click()
With SickLeaveForm
If chkAddleave1 = True Then
.txtShiftDate1.Enabled = True
.txtShiftDate1.BackColor = &H80000005
.OptionButtonAM1.Enabled = True
.OptionButtonPM1.Enabled = True
.OptionButtonND1.Enabled = True
Else
.txtShiftDate1.Enabled = False
.txtShiftDate1.BackColor = &H8000000A
.OptionButtonAM1.Enabled = False
.OptionButtonPM1.Enabled = False
.OptionButtonND1.Enabled = False
End If
End With
End Sub
Private Sub chkAddleave2_Click()
With SickLeaveForm
If chkAddleave2 = True Then
.txtShiftDate2.Enabled = True
.txtShiftDate2.BackColor = &H80000005
.OptionButtonAM2.Enabled = True
.OptionButtonPM2.Enabled = True
.OptionButtonND2.Enabled = True
Else
.txtShiftDate2.Enabled = False
.txtShiftDate2.BackColor = &H8000000A
.OptionButtonAM2.Enabled = False
.OptionButtonPM2.Enabled = False
.OptionButtonND2.Enabled = False
End If
End With
End Sub
Private Sub chkAddleave3_Click()
With SickLeaveForm
If chkAddleave3 = True Then
.txtShiftDate3.Enabled = True
.txtShiftDate3.BackColor = &H80000005
.OptionButtonAM3.Enabled = True
.OptionButtonPM3.Enabled = True
.OptionButtonND3.Enabled = True
Else
.txtShiftDate3.Enabled = False
.txtShiftDate3.BackColor = &H8000000A
.OptionButtonAM3.Enabled = False
.OptionButtonPM3.Enabled = False
.OptionButtonND3.Enabled = False
End If
End With
End Sub
Private Sub chkAddleave4_Click()
With SickLeaveForm
If chkAddleave4 = True Then
.txtShiftDate4.Enabled = True
.txtShiftDate4.BackColor = &H80000005
.OptionButtonAM4.Enabled = True
.OptionButtonPM4.Enabled = True
.OptionButtonND4.Enabled = True
Else
.txtShiftDate4.Enabled = False
.txtShiftDate4.BackColor = &H8000000A
.OptionButtonAM4.Enabled = False
.OptionButtonPM4.Enabled = False
.OptionButtonND4.Enabled = False
End If
End With
End Sub
Private Sub chkAddleave5_Click()
With SickLeaveForm
If chkAddleave5 = True Then
.txtShiftDate5.Enabled = True
.txtShiftDate5.BackColor = &H80000005
.OptionButtonAM5.Enabled = True
.OptionButtonPM5.Enabled = True
.OptionButtonND5.Enabled = True
Else
.txtShiftDate5.Enabled = False
.txtShiftDate5.BackColor = &H8000000A
.OptionButtonAM5.Enabled = False
.OptionButtonPM5.Enabled = False
.OptionButtonND5.Enabled = False
End If
End With
End Sub
这是我尝试过的
Private Sub EnableAddLeave()
Dim i As Integer
Dim chkAddleave As MSForms.CheckBox
Dim txtshiftdate As MSForms.textbox
Dim OptionButtonAM As MSForms.OptionButton
Dim OptionButtonPM As MSForms.OptionButton
Dim OptionButtonND As MSForms.OptionButton
For i = 1 To 5
With SickLeaveForm
If chkAddleave(i) = True Then
txtshiftdate(i).Enabled = True
txtshiftdate(i).BackColor = &H80000005
OptionButtonAM(i).Enabled = True
OptionButtonPM(i).Enabled = True
OptionButtonND(i).Enabled = True
Else
txtshiftdate(i).Enabled = False
txtshiftdate(i).BackColor = &H8000000A
OptionButtonAM(i).Enabled = False
OptionButtonPM(i).Enabled = False
OptionButtonND(i).Enabled = False
End If
End With
Next i
End Sub
您可以保留每个复选框的事件处理程序,但让它们调用您的
EnableAddLeave
Sub 并传入对用户窗体上相关控件的引用...不需要 For
循环。例如(将其添加到用户窗体的代码隐藏中):
Private Sub EnableAddLeave(chkBox As MSForms.CheckBox, txtBox As MSForms.TextBox, optBtnAm As MSForms.OptionButton, _
optBtnPm As MSForms.OptionButton, optBtnNd As MSForms.OptionButton)
If chkBox = True Then
txtBox.Enabled = True
txtBox.BackColor = &H80000005
optBtnAm.Enabled = True
optBtnPm.Enabled = True
optBtnNd.Enabled = True
Else
txtBox.Enabled = False
txtBox.BackColor = &H8000000A
optBtnAm.Enabled = False
optBtnPm.Enabled = False
optBtnNd.Enabled = False
End If
End Sub
然后每个复选框的事件处理程序可以调用这个例如
Private Sub chkAddleave1_Click()
EnableAddLeave chkAddleave1, txtShiftDate1, OptionButtonAM1, OptionButtonPM1, OptionButtonND1
End Sub
和
Private Sub chkAddleave2_Click()
EnableAddLeave chkAddleave2, txtShiftDate2, OptionButtonAM2, OptionButtonPM2, OptionButtonND2
End Sub
其他 3 个复选框依此类推
Option Explicit
Private Sub EnableAddLeave()
Dim i As Integer, bChk As Boolean
With SickLeaveForm
For i = 1 To 5
bChk = .Controls("chkAddleave" & i)
.Controls("OptionButtonAM" & i).Enabled = bChk
.Controls("OptionButtonPM" & i).Enabled = bChk
.Controls("OptionButtonND" & i).Enabled = bChk
With .Controls("txtshiftdate" & i)
.Enabled = bChk
.BackColor = IIf(bChk, &HFFFFFF, &HC0C0C0)
End With
Next i
End With
End Sub