我尝试使用 for 循环来使我的代码更简单,但仍然出现错误

问题描述 投票:0回答:2

我是 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
excel vba userform
2个回答
0
投票

您可以保留每个复选框的事件处理程序,但让它们调用您的

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 个复选框依此类推


0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.