0

条件が満たされたときにユーザーフォームのテキストボックスをロックダウンするコードを次に示します。繰り返しの形で明らかに非効率的です。

    With txtESPPStock
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtChildLife
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtHealthcareFSA
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtLtdPlusBuyUp
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtMedicalDental
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtSpouseLife
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtStdPlusBuyUp
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtSupplementalLife
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txtVision
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With
    With txt401kReg
        .Locked = True
        .BackColor = &H80000000
        .value = ""
        .Enabled = False
    End With

内部の設定はすべて同じなので、頭が良ければもっと少ない行数でコーディングできそうです。私が言いたいのは、各テキストボックスについて、次のようなことです:

With txtESPPStock
    Call GetProperties
End With

または、さらに良いことに、プロパティ設定が必要なすべてのプロパティを配列に配置して、次のようなことができるようにします。

For txtFieldNumber = 0 To 15
    For PropertySettings = 0 To 3
        ArrayValue(txtFieldNumber, PropertySettings) = getproperty(PropertySettings)
    Next PropertySettings
Next txtFieldNumber

多分私はこの最後のものの構造に近いですが、これを行う方法を明確にする知識が欠けているようです. 誰かが私をまっすぐにするのを手伝ってくれますか?


範囲をループするのと同じ方法で配列をループできることを学んだ後、期待どおりにコードをスリム化し、設定を再度コーディングすることなく、他のユーザーフォームで再利用可能なツールを作成することができました。

Sub SetLockedFields(ByRef arrLockedFields() As Variant)

    Dim varFieldToLock As Variant
        For Each varFieldToLock In arrLockedFields
            With frmPaycheckEntry.Controls(varFieldToLock)
                .Locked = True
                .BackColor = &H80000000
                .value = ""
                .Enabled = False
            End With
        Next

End Sub

上記の最初のコード例に示されているすべての作業を行うには、テキスト フィールドをバリアント配列に配置して、次のように渡します。

Private Sub UserForm_Initialize()

    Dim arrLockedFields() As Variant
           .
           .
           .

        If <condition is met> Then
            ReDim arrLockedFields(1 To 11)
            arrLockedFields = Array("txtBasicLife", "txtChildLife", _
                                "txtESPPStock", "txtHealthcareFSA", _
                                "txtLtdPlusBuyUp", "txt401kReg", _
                                "txtMedicalDental", "txtSpouseLife", _
                                "txtStdPlusBuyUp", "txtSupplementalLife", _
                                "txtVision")
        End If

    Call SetLockedFields(arrLockedFields)

End Sub
4

1 に答える 1

1

はい、コードの繰り返しを避けるためにループを使用できます。

Sub t1()
    Dim ctrl As Control
    For Each ctrl In UserForm1.Controls
        'Check if the control is a textbox
        If TypeName(ctrl) = "TextBox" Then
            With UserForm1.Controls(ctrl.Name)
                .Locked = True
                .BackColor = &H80000000
                .Value = ""
                .Enabled = False
            End With
        End If
    Next
End Sub

別の例: 特定の名前がある場合

Private Sub CommandButton1_Click()
    Dim names() As Variant
    Dim name As Variant
    names = Array("TextBox1", "TextBox2")
    For Each name In names
        With UserForm1.Controls(name)
            .Locked = True
            .BackColor = &H80000000
            .Value = ""
            .Enabled = False
        End With
    Next
End Sub
于 2013-10-30T03:13:16.317 に答える