簡體   English   中英

ms-access縮短VBA代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM