Excel VBA工作表更改事件导致消息框多次出现

时间:2018-10-04 21:31:43

标签: excel vba excel-vba excel-2013

下面的代码在将颜色更改回图纸的原始颜色之前,检查以确保某个单元格具有值。通过将颜色从黄色更改为纸张的原始颜色,用户可以进行打印。问题是,一旦输入了值,则更改表单上的其他任何内容时,消息框都会继续出现。消息框是否应该放在工作表更改事件之外?我是编程新手,所以能获得任何帮助!

Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect Password:="Anthem"
  If Range("G50").Value <> "" Then
    MsgBox "You may now print"
    Range("G50").Interior.Color = RGB(221, 235, 247)
  End If
ActiveSheet.Protect Password:="Anthem", AllowFormattingRows:=True
End Sub

谢谢

安东尼

3 个答案:

答案 0 :(得分:6)

首先,每次更改时,停止保护/取消保护工作表。将此代码与Worksheet_Change一起放入工作表的专用代码表中,并运行一次。

Private Sub Worksheet_Change(ByVal Target As Range)
    if not intersect(Range("G50"), target) is nothing then
        If Range("G50").Value <> "" Then
            MsgBox "You may now print"
            Range("G50").Interior.Color = RGB(221, 235, 247)
        end if
    End If
End Sub

现在,您可以使用VBA对工作表进行任何所需的操作,而不必取消保护它。如果您在其他任何地方都具有保护/取消保护的功能,请立即删除它;不需要。

现在,转到您的实际问题。只需将消息框操作限制在Range(“ G50”)发生变化的时间,而不是无关的变化。

{{1}}

答案 1 :(得分:1)

您可以尝试一下。仅在更改G50时触发:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.DisplayAlerts = False
    ActiveSheet.Unprotect Password:="Anthem"
    If Target.Address = Target.Worksheet.Range("G50").Address Then
        If Range("G50") <> vbNullString Then
            MsgBox "You may now print"
            Range("G50").Interior.Color = RGB(221, 235, 247)
        End If
    End If
    ActiveSheet.Protect Password:="Anthem", AllowFormattingRows:=True
    Application.DisplayAlerts = True
End Sub

答案 2 :(得分:0)

禁用代码中的事件

    Private Sub Worksheet_Change(ByVal Target As Range)
application.enableevents=false    
ActiveSheet.Unprotect Password:="Anthem"
      If Range("G50").Value <> "" Then
        MsgBox "You may now print"
        Range("G50").Interior.Color = RGB(221, 235, 247)
      End If
    ActiveSheet.Protect Password:="Anthem", AllowFormattingRows:=True
application.enableevents=true
    End Sub