【问题标题】:VBa Code not coming out of loopVBa 代码没有跳出循环
【发布时间】:2016-11-02 15:46:28
【问题描述】:

问题看起来很大,但对你们来说答案很简单 我的代码第一次有效,第二次尝试无效。 我有 2 张“菜单”和“子表” 基本上,我在菜单表是/否值上设置了数据验证下拉菜单。 第一个场景 选择“是”将启用第二张表(子表)上的单元格 选择“否”将禁用第二张表(子表)上的单元格。

第二种情况, 用户选择“否”并选择第二张工作表将提示他启用单元格“确定”并取消。 选择“确定”将启用单元格,下拉列表中的值将更改为“是” 在 msgprompt 中选择“取消”将禁用单元格,下拉列表中的值将保持为“否” 如果用户在下拉菜单中选择了“是”,则不应显示消息提示。

问题:代码工作正常,直到第二个场景。 用户选择“否”并在消息提示中选择第二张表,他选择“否”。现在细胞被禁用。 如果用户返回菜单表并选择“是”,则不会启用单元格。 不知道现在是什么不启用单元格。请帮忙

菜单表上的代码

Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Range("A11")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    Select Case (Target.Value)
      Case "YES"
        Call uEnable
      Case "NO"
         Call uDisable
         Exit Sub
    End Select
  Application.EnableEvents = True
End Sub

子表上的代码

Private Sub Worksheet_Activate()
  UDisable
End Sub

模块代码

Option Explicit
Private mMessageDisplayed As Boolean
Public Sub uDisable()
  If ActiveSheet.ProtectContents And Not mMessageDisplayed Then
    mMessageDisplayed = True
    If ThisWorkbook.Sheets("Menu").Range("A11") = "NO" Then
      If MsgBox("Cells are locked on current sheet, press ok to Unlock", vbOKCancel + vbInformation) = vbOK Then
        ThisWorkbook.Worksheets("Menu").Range("A11") = "YES"
        With ThisWorkbook.Sheets("Subsheet")
          ActiveWorkbook.Unprotect Password:="xyz"
          .Range("E13:E14").Locked = False
          ActiveWorkbook.Unprotect Password:="xyz"
        End With
      Else
        ThisWorkbook.Worksheets("Menu").Range("A11") = "NO"
        With ThisWorkbook.Sheets("Subsheet")
          ActiveWorkbook.Unprotect Password:="xyz"
          .Range("E13:E14").Locked = True
          ActiveWorkbook.Protect Password:="xyz"
        End With
      End If
    Else
      Exit Sub
    End If
  End If
End Sub

第二个模块

Public Sub uEnable()
  With ThisWorkbook.Sheets("Subsheet")
    ActiveWorkbook.Unprotect Password:="xyz"
    .Range("E13:E14").Locked = False
    ActiveWorkbook.Protect Password:="xyz"
  End With
End Sub

我尝试使用调试方法,无法确定根本原因。

两个相交代码

`Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("E42")) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        Dim inputCell As Range
        Set inputCell = Range("E43")
            Select Case (Target.Value)
                Case "Specific Days"
                    inputCell.Locked = False
                    inputCell.Activate
                Case Else
                'This handles **ANY** other value in the dropdown
                    inputCell.Locked = True
    '                inputCell.Clear
            End Select
       Application.EnableEvents = True

If Intersect(Target, Range("E29")) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        Select Case (Target.Value)
            Case "YES"
                Call Notify
            Case "NO"
                 Call NotifyUserGeneral
        End Select
       Application.EnableEvents = True
End Sub`

【问题讨论】:

  • 我认为uDisable 正在锁定和保护工作表。而uEnable 只是解锁。可能也需要使用相关密码取消保护。
  • 在多个地方进行是/否检查似乎也是多余的。你应该让一个部分处理
  • @destination-data 我尝试在 uEnable 中使用 unprotect/protect (修改了上面的代码)。但这也有帮助!
  • 你尝试的时候发生了什么?
  • @destination-data 问题仍然存在。当 drop 设置为“yes”时,单元格未启用。我必须选择“否”并在消息提示上单击“确定”以单击“确定”,以便启用单元格。

标签: vba excel


【解决方案1】:

Call uDisable 下方删除Exit Sub。否则Application.EnableEvents = True 永远不会被调用...

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
    Application.EnableEvents = False
    Select Case (Target.Value)
        Case "YES"
            Call uEnable
        Case "NO"
            Call uDisable
            'Exit Sub     <---Can't do this.
    End Select
    Application.EnableEvents = True
End Sub

...并且没有任何其他代码可以重新打开它们。关闭事件处理后,您不能依赖事件处理程序来设置 Application.EnableEvents = True

【讨论】:

  • @Comintem,当然,让我快点试试!!
  • @Comintem,不幸的是,它有帮助。任何想法,为什么当我在下拉列表中选择“是”值时没有调用 uEnable 功能模块
  • 我想这就是问题所在。调用 uEnable 不是调用模块。但不确定可能是什么原因。有的话请推荐
  • @sady - Public uEnable() 应该是 Public Sub uEnable()。此外,您在uDisable 中有Range("A11"),但在Worksheet_Change 中有Range("A1")。那些应该是不同的细胞吗?
  • @Comintem - 我在复制时犯了一个错误。这是一个错字。在工作簿上,我看到它是 public Sub uEnable()。范围(“A1”)实际上是(A11),?又是一个错字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2012-01-30
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
相关资源
最近更新 更多