[英]ms-access shorten vba code
我在項目中大量使用以下代碼:
txtVoornaam.Locked = False
txtVoornaam.BorderStyle = 4
txtVoornaam.BorderColor = RGB(255, 165, 0
txtAchternaam.Locked = False
txtAchternaam.BorderStyle = 4
txtAchternaam.BorderColor = RGB(255, 165, 0)
txtAfdeling.Locked = False
txtAfdeling.BorderStyle = 4
txtAfdeling.BorderColor = RGB(255, 165, 0)
我想知道是否有一種方法可以在我的代碼中不顯示或縮短它。 如果我使用幾次,代碼將變得很長。
每當您需要重復一組指令時,而不是復制+粘貼代碼,您的第一個反應應該是問自己“如何避免一遍又一遍地復制此塊?” -解決方案幾乎總是提取方法並對其進行參數化。
因此,您采用了重復的塊之一:
txtAchternaam.Locked = False
txtAchternaam.BorderStyle = 4
txtAchternaam.BorderColor = RGB(255, 165, 0)
然后在新范圍中最后一次復制它:
Private Sub RenameMe()
txtAchternaam.Locked = False
txtAchternaam.BorderStyle = 4
txtAchternaam.BorderColor = RGB(255, 165, 0)
End Sub
然后您提取參數:
Private Sub RenameMe(ByVal target As Control)
target.Locked = False
target.BorderStyle = 4
target.BorderColor = RGB(255, 165, 0)
End Sub
然后,將重復的塊替換為對該新過程的調用:
RenameMe txtVoornaam
RenameMe txtAchternaam
RenameMe txtAfdeling
或者,如果仍然很乏味,則可以迭代控件並在循環主體中調用該過程-最好的方法就是為您服務。
並且,如果需要更大的靈活性,請提取更多參數,並根據需要將它們設置為“ Optional
”:
Private Sub RenameMe(ByVal target As Control, Optional ByVal lockCtrl As Boolean = False, Optional ByVal brdrStyle As Long = 4, Optional ByVal brdrColor As Long = 42495)
target.Locked = lockCtrl
target.BorderStyle = brdrStyle
target.BorderColor = brdrColor
End Sub
現在最困難的部分是給RenameMe
一個有意義的名稱,以正確傳達這里發生的事情。 我建議使用FormatControl
或類似的方法。
如果您有多個要通過表單創建的控件,則可以執行以下操作:
Dim names() As String
names = Split("txtVoornaam,txtAchternaam,txtAfdeling", ",")
Dim ctrl As Variant
Dim ctrlName As Variant
For Each ctrl In Me.Controls
For Each ctrlName In names
If StrComp(ctrlName, ctrl.Name) = 0 Then
ctrl.Locked = False
ctrl.BorderStyle = 4
ctrl.BorderColor = RGB(255, 165, 0)
End If
Next ctrlName
Next ctrl
此代碼遍歷適合您列表的每個控件名稱。
但是,這要比Mat's Mug的回答效率低得多,因為您要遍歷表單中的整個控件列表,但是它確實展示了如何獲取靜態名稱列表並遍歷它們和一個集合。
如果要更改所有文本控件,這將是一種方法。 只需刪除ctrlName檢查。
正如Parfait正確指出的那樣,如果您對控件名稱有信心,可以將代碼縮短為以下內容:
Dim names() As String
names = Split("txtVoornaam,txtAchternaam,txtAfdeling", ",")
Dim ctrlName As Variant
For Each ctrlName In names
With Me.Controls(ctrlName)
.Locked = False
.BorderStyle = 4
.BorderColor = RGB(255, 165, 0)
End With
Next ctrlName
function Lockdown(strControl)
with me(strControl)
.locked = false
.borderstyle = 4
.bordercolor = RGB(255,165,0)
end with
使用我還是forms!formname,具體取決於您從哪里打電話
如果您的控件相同,則顯然將它們放在可以從任何地方調用的單個子功能中。 我不會嘗試鎖定或更改文本框的格式,而只是啟用/禁用,它將為您處理格式:
textbox.enabled = true / false
如果您要在多種表單上執行此操作,並且確實希望單個子功能可以控制每個表單上的文本框的啟用/禁用,那么也可以通過多種方式來實現,解決方案將取決於您的需求,但當然可行,有些在上面已經發表了評論。
例如,您可以使用文本框的“標記”屬性來標記要啟用/禁用的表單上的文本框。 然后,您可以使用單個子/函數作為表單的參考,然后可以讀取該表單上所有文本框的“標簽”屬性,如果您標記了這些文本框,則可以繼續啟用/禁用他們
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.