【问题标题】:Msgbox show only onceMsgbox 只显示一次
【发布时间】:2020-10-25 20:14:04
【问题描述】:

有人可以修改我的代码,使消息框只显示一次吗? 我已经做了一段时间了,但没有成功。

我正在处理的文件是一个寄存器。每当 AD13:AJ13 的总和超过 4 时,msg 应该显示, 提示用户采取行动。但是到目前为止,一旦范围内的单元格超过 4,msgbox 就会显示范围内的所有更改,即使总和低于 4。这不是故意的,我只希望用户在范围内的每个单元格上收到一次通知( AD13:AJ13)

代码:

Private Sub Worksheet_Calculate()

    Dim myCell As Range

    For Each myCell In Range("AD13:AJ13")
        If myCell > 4 Then
        MsgBox "Management approval is required once the value exceed 4"
            Exit Sub
        End If
    Next myCell
End Sub

【问题讨论】:

  • 我认为问题与您选择放置此代码的事件有关。为什么要在计算事件中使用它?
  • 我怀疑@brax 确定了核心问题。使用Worksheet_Change() 似乎更自然——确保代码仅在该范围内的单元格更改时运行。您可以维护一个全局布尔标志来跟踪该消息框何时显示,但这对我来说有点太笨拙了。
  • 不能给你任何明确的答案braX。这是我在搜索互联网后能够完成的工作。你能生产出能让我达到我想要的结果的东西吗?

标签: excel vba msgbox


【解决方案1】:

我有点同意问题下方的 cmets,因为 Worksheet_Change 似乎是一个更自然的触发器。但是,问题可能在于该范围没有直接更改(即单元格的公式可能依赖于其他工作表甚至其他工作簿中的单元格)。

您基本上需要以某种方式保存这些单元格的当前状态。请尝试此代码,看看它是否有帮助或为您打开一个新的想法窗口。

Private Sub Worksheet_Calculate()
    Dim rngSavedState As Range
    Dim j As Integer
    Dim bMsgBoxShown As Boolean
    
    Set rngSavedState = Range("AD14:AJ14")
    
    Application.EnableEvents = False
    With Range("AD13:AJ13")
        bMsgBoxShown = False
        For j = 1 To .Columns.Count
            If .Cells(1, j).Value <> rngSavedState.Cells(1, j).Value Then
                rngSavedState.Cells(1, j).Value = .Cells(1, j).Value
                If .Cells(1, j) > 4 And Not bMsgBoxShown Then
                    MsgBox "Management approval is required once the value exceed 4"
                    bMsgBoxShown = True
                End If
            End If
        Next j
    End With
    Application.EnableEvents = True
End Sub

您显然需要更改rngSaveState 的地址以适合您的应用程序。 万事如意

【讨论】:

  • 感谢超级对称。真的很感激!
  • @Thomas Vester 很高兴为您提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2011-01-23
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多