ms access缩短vba代码

ms access缩短vba代码,vba,ms-access,Vba,Ms Access,我在我的项目中经常使用以下代码: 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 txt

我在我的项目中经常使用以下代码:

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)
我想知道是否有一种方法可以不在我的代码中显示这个或缩短它。如果我使用几次,代码就会变得很长

function Lockdown(strControl)

with me(strControl)
   .locked = false
   .borderstyle = 4
   .bordercolor = RGB(255,165,0)
end with
使用我或表格!formname取决于您从何处呼叫

使用我或表格!formname取决于您从何处调用,每当您需要重复一组指令时,您的第一反应应该是问自己“如何避免重复复制此块?”——解决方案通常是提取一个方法并将其参数化

因此,您可以选择一个重复的块:

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
或者,如果这仍然很乏味,您可以迭代控件并在循环体中调用该过程-任何对您最合适的方法

如果您需要更大的灵活性,请提取更多参数,并根据需要将其设置为可选:

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
或类似的方法。

每当您需要重复一组指令时,您的第一反应应该是问自己“如何避免重复复制此块?”——解决方案通常是提取一个方法并将其参数化

因此,您可以选择一个重复的块:

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
或者,如果这仍然很乏味,您可以迭代控件并在循环体中调用该过程-任何对您最合适的方法

如果您需要更大的灵活性,请提取更多参数,并根据需要将其设置为可选:

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的Mug的答案效率要低得多,因为您正在迭代表单中的整个控件列表,但它确实展示了如何获取静态名称列表并迭代它们和集合

如果您想更改所有文本控件,这将是一种方法;只需删除ctrlName检查

正如已经正确指出的,如果您对控件名称有信心,可以将代码缩短为以下内容:

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

如果您有多个通过表单创建的控件,则可以执行以下操作:

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的Mug的答案效率要低得多,因为您正在迭代表单中的整个控件列表,但它确实展示了如何获取静态名称列表并迭代它们和集合

如果您想更改所有文本控件,这将是一种方法;只需删除ctrlName检查

正如已经正确指出的,如果您对控件名称有信心,可以将代码缩短为以下内容:

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

如果控件是相同的,显然要将它们放在一个子/函数中,您可以从任何地方调用它。我不会尝试锁定或更改文本框的格式,而只是启用/禁用,它将为您处理格式:

textbox.enabled=真/假

如果您在多个表单上执行此操作,并且确实希望使用单个子/函数来控制启用/禁用每个表单上的文本框,那么也有各种方法来实现此操作,解决方案将取决于您的需要,但肯定是可行的,而且有些人已经在上面进行了评论


例如,您可以使用文本框的“tag”属性来标记表单上要启用/禁用的文本框。然后,您可以拥有一个子/函数,该子/函数将在表单中作为引用,然后您可以读取该表单上所有文本框的“tag”属性,如果它们是您标记的文本框,您可以继续启用/禁用它们

如果控件相同,显然可以将它们放在一个子/函数中,您可以从任何地方调用它们。我不会尝试锁定或更改文本框的格式,而只是启用/禁用,它将为您处理格式:

textbox.enabled=真/假

如果您在多个表单上执行此操作,并且确实希望使用单个子/函数来控制启用/禁用每个表单上的文本框,那么也有各种方法来实现此操作,解决方案将取决于您的需要,但肯定是可行的,而且有些人已经在上面进行了评论


例如,您可以使用文本框的“tag”属性来标记表单上要启用/禁用的文本框。然后,您可以拥有一个子/函数,将表单作为参考,然后您可以读取该表单上所有文本框的“tag”属性,如果它们是您标记的文本框,您将继续启用/禁用它们

这是响应用户活动还是在设置中?我会添加一个数组,比如说
arrControlsResponseToSelection
,然后应用3种样式设置循环这个数组。或者循环名称,比如
UI\u Response\u txtaffeling
你的问题本身并不是离题,但是请注意,如果你正在寻找改进你已经在工作的代码的方法,或者只是对你工作的代码的任何/所有方面的一些反馈(“工作”非常重要),那么你会很高兴听到,展示代码并告诉审阅者代码的作用