【问题标题】:Using wildcards within VBA for Microsoft Access在 VBA 中为 Microsoft Access 使用通配符
【发布时间】:2017-06-01 16:34:36
【问题描述】:

让我们先说我的代码知识充其量是有限的。我通常理解这些概念,但从来没有很好地实施它们。也就是说,这里是我的一个项目中的一个 sn-p 代码。

Option Compare Database
Private Sub Form_Current()
If IsNull(Me![OPT-78 (5900EL)]) Then
    Me![OPT-78 (5900EL)].Visible = False
    Me![OPT-78 (5900EL) Label].Visible = False
Else
    Me![OPT-78 (5900EL)].Visible = True
    Me![OPT-78 (5900EL) Label].Visible = True
End If
If IsNull(Me![OPT-78 (7900EL)]) Then
    Me![OPT-78 (7900EL)].Visible = False
    Me![OPT-78 (7900EL) Label].Visible = False
Else
    Me![OPT-78 (7900EL)].Visible = True
    Me![OPT-78 (7900EL) Label].Visible = True
End If
If IsNull(Me![OPT-152 (4310B)]) Then
    Me![OPT-152 (4310B)].Visible = False
    Me![OPT-152 (4310B) Label].Visible = False
Else
    Me![OPT-152 (4310B)].Visible = True
    Me![OPT-152 (4310B) Label].Visible = True
End If

它位于“当前”事件的表单内。现在我知道通配符可以将所有这些 if then else 语句限制为一个简单优雅的单 if 语句解决方案,但我无法让它们工作。我试过 *、%、__ 和 ?,但没有运气。还有更多 if else 语句需要编写,所以我希望有一个更清洁的解决方案。

谢谢!

【问题讨论】:

  • 也许可以使用Select 语句来缩短您的代码?

标签: vba ms-access wildcard


【解决方案1】:

我首先创建一个 Sub 来处理设置可见性:

Sub SetVis(controlName as String)
   Dim vis as Boolean
   vis = Not IsNull(Me.Controls(controlName))
   Me.Controls(controlName).Visible = vis
   Me.Controls(controlName & " Label").Visible = vis
End sub

然后你可以从一个循环中驱动那个 sub,也许通过循环表单的 Controls 集合来找到感兴趣的那个。

Dim c
For Each c in Me.Controls
    'some If statement here to see if this is a control you're interested in
    'Might also want to check that the control type is a textbox so you can
    '  skip the labels
    If c.Name like "OPT*" And Not c.Name like "*Label" Then
        SetVis CStr(c.Name)
    End if
Next c

或基于固定名称数组的简单循环:

Dim c
For Each c In Array("OPT-78 (5900EL)", "OPT-78 (7900EL)", "OPT-152 (4310B)") 
    SetVis CStr(c)
Next c  

【讨论】:

  • 注意(也是@Nogg)如果一个标签附加到它的文本框,你只需要设置文本框可见/不可见,标签会自动设置。
  • 谢谢大家。 @ Andre:我发现标签在关闭可见性的情况下跟随文本框,但是当我稍后以表单将其重新打开时,它不会。不知道为什么。 @Tim:我正在查看您发布的代码,我想知道这是否可以让我获取具有不同名称的文本框的名称。换句话说,我试图抓取文本框 OPT-1、OPT-12A、OPT-435 并根据里面的值是否为空来打开和关闭它们。我不太熟悉如何设置循环和while。大约 8 年前,我参加了一个非常基础的编程课程。 ;)
  • 查看我上面的编辑(所有未经测试,但应该给你大致的想法)
  • 谢谢蒂姆,有了阵列解决方案,我不必继续手动添加“OPT”吗?我已经有了工作的可见性,但我真正想要得到的东西基本上是让代码搜索任何名为“OPT*”的东西。可能会有数千个“OPT”以及我将遇到类似问题的其他领域。 “OPT”只是文本框。不确定这是否有帮助。我真的很感谢你在这方面的帮助。我是一名插画家,正在尝试编写代码哈哈。
  • 我意识到我将在一定程度上手动添加文本框,但我希望必须为每个文本框更改代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多