繁体   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