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