【问题标题】:Visible property working inconsistently in vba可见属性在 vba 中工作不一致
【发布时间】:2018-04-16 12:40:25
【问题描述】:

我有一个重置按钮,它应该隐藏和禁用其表单上的某些按钮,但它不起作用。我已经尝试将相同的ctl.visible = falsectl.enabled = false 编码应用到同一个子中的其他控件(包括按钮),并且一切正常 - 只是为了这些按钮它拒绝。没有错误出现,它只是不会更改可见或启用的属性。我还在访问的属性列表中手动更改了它们的属性,这也有效。一个单独的子可以启用和取消隐藏它们工作正常。

我需要隐藏和禁用的按钮标有“旋转”。它们在下面的重置子底部处理。提供整个 sub 以供上下文使用,以防它对我的问题负责。

Private Sub btnReset_Click()

Dim ctl As Control

For Each ctl In Screen.ActiveForm
If ctl.Tag Like "*lckbtn*" Then
    ctl.Enabled = True
    ctl.Visible = True
ElseIf ctl.Tag Like "*lcktxt*" Then
    ctl.Enabled = False
    ctl.Locked = True
    ctl.BackColor = RGB(236, 236, 236)
On Error Resume Next
    ctl.Value = ""
ElseIf ctl.Name = "PointsRemaining" Then
    ctl.ForeColor = RGB(140, 140, 140)
    ctl.Value = 27
    End If
If ctl.Tag Like "*array*" Then
    ctl.ForeColor = RGB(140, 140, 140)
    End If
    Next ctl
If ctl.Tag Like "*spin*" Then
    ctl.Enabled = False
    ctl.Visible = False
    End If

Array1 = 15
Array2 = 14
Array3 = 13
Array4 = 12
Array5 = 10
Array6 = 8

End Sub

【问题讨论】:

  • if like 区分大小写。也许是你的问题。
  • 情况是一样的——出于这种原因,我特意避免在标签中使用大写字母。

标签: vba ms-access


【解决方案1】:

试试这个


Option Explicit

Private Sub btnReset_Click()
    Dim ctl As Control

    For Each ctl In Screen.ActiveForm
        Select Case True
            Case InStr(1, ctl.Tag, "lckbtn", vbTextCompare)
                ctl.Enabled = True
                ctl.Visible = True
            Case InStr(1, ctl.Tag, "lcktxt", vbTextCompare)
                ctl.Enabled = False
                ctl.Locked = True
                ctl.BackColor = RGB(236, 236, 236)
                On Error Resume Next
                ctl.Value = ""
            Case ctl.Name = "PointsRemaining"
                ctl.ForeColor = RGB(140, 140, 140)
                ctl.Value = 27
            Case InStr(1, ctl.Tag, "array", vbTextCompare)
                ctl.ForeColor = RGB(140, 140, 140)
            Case InStr(1, ctl.Tag, "spin", vbTextCompare)
                ctl.Enabled = False
                ctl.Visible = False
        End Select
    Next ctl
    Array1 = 15
    Array2 = 14
    Array3 = 13
    Array4 = 12
    Array5 = 10
    Array6 = 8
End Sub

您的代码存在一些问题

  • 缩进很容易引起误解
  • If ctl.Tag Like "*spin*" ThenFor 循环之外
    • 当执行点到达这一行时,ctl 未设置(错误)
    • 您还有On Error Resume Next,它隐藏了上述错误
    • On Error Resume Next 是一个过程级的处理程序(不仅针对以下行)
  • 如前所述,Like 区分大小写(由于上一期,还没有达到这一点)

这是带有适当缩进的代码(它表明最后一个 If 在循环之外)


Private Sub btnReset_Click()
    Dim ctl As Control

    For Each ctl In Screen.ActiveForm
        If ctl.Tag Like "*lckbtn*" Then
            ctl.Enabled = True
            ctl.Visible = True
        ElseIf ctl.Tag Like "*lcktxt*" Then
            ctl.Enabled = False
            ctl.Locked = True
            ctl.BackColor = RGB(236, 236, 236)
On Error Resume Next
            ctl.Value = ""
        ElseIf ctl.Name = "PointsRemaining" Then
            ctl.ForeColor = RGB(140, 140, 140)
            ctl.Value = 27
        End If
        If ctl.Tag Like "*array*" Then
            ctl.ForeColor = RGB(140, 140, 140)
        End If
    Next ctl
    If ctl.Tag Like "*spin*" Then   '<-- outside of the For loop (error as ctl is not set)
        ctl.Enabled = False
        ctl.Visible = False
    End If
    Array1 = 15
    Array2 = 14
    Array3 = 13
    Array4 = 12
    Array5 = 10
    Array6 = 8
End Sub

【讨论】:

  • 这行得通。但为什么!?如果我用原始的 Like 子句替换 InStr 函数,它也可以工作,但仍然使用 Select Case 而不是 If/ElseIf。当然 Select Case 更整洁,但为什么 If Then 不起作用?
  • 我在您的代码中添加了适当的缩进以显示主要问题
  • 好的,同样的问题,不同的地方:现在数组位不起作用:Case ctl.Tag Like "*array*" ctl.ForeColor = RGB(140, 140, 140) 颜色保持黑色......当我将它切换到 InStr 函数而不是 Like 时问题仍然存在,即使我已经摆脱了那个错误处理程序,因为我不再需要它了。
  • 当然,但是如果这个问题是固定的,我们应该关闭它(请接受答案),然后打开一个新的并提供与数组相关的完整代码(在这个问题中没有与它们 - 不确定它们是在哪里创建、重新变暗、更新等)
  • 嗯嗯;上次我问了一个问题,这让我等了一整天才能接受答案。我现在已经全部修好了。感谢您的帮助!
猜你喜欢
  • 2018-05-29
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 2018-05-30
相关资源
最近更新 更多