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