ms-access缩短了vba代码

时间:2017-03-31 14:01:22

标签: 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
txtAfdeling.BorderStyle = 4
txtAfdeling.BorderColor = RGB(255, 165, 0)

我想知道是否有办法不在我的代码中显示这个或缩短它。如果我使用它几次,代码会变得很长。

4 个答案:

答案 0 :(得分:5)

每当你需要重复一套说明,而不是复制+面食代码时,你的第一反应应该是问自己"我怎样才能避免复制这个块并且结束?" - 并且解决方案几乎总是提取方法并对其进行参数化。

所以你采取了一个重复的块:

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或类似的东西。

答案 1 :(得分:2)

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

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

如果您想要更改所有文本控件,这将是这样做的方法;只需删除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

答案 2 :(得分:1)

function Lockdown(strControl)

with me(strControl)
   .locked = false
   .borderstyle = 4
   .bordercolor = RGB(255,165,0)
end with

根据您的来电地点使用我或表格!formname

答案 3 :(得分:0)

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

textbox.enabled = true / false

如果你在多个表单上执行此操作并且真的想要一个子/函数来控制启用/禁用每个表单上的文本框,那么有多种方法可以做到这一点,解决方案将取决于您的需求,但肯定可行的,有些已经在上面评论过。

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