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
你的问题本身并不是离题,但是请注意,如果你正在寻找改进你已经在工作的代码的方法,或者只是对你工作的代码的任何/所有方面的一些反馈(“工作”非常重要),那么你会很高兴听到,展示代码并告诉审阅者代码的作用