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

Bob*_*der 1 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
Run Code Online (Sandbox Code Playgroud)

谢谢,

安东尼

小智 6

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

private sub protectOnce()
    me.Unprotect Password:="Anthem"
    me.Protect Password:="Anthem", AllowFormattingRows:=True, UserInterfaceOnly:=True
end sub
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用VBA对工作表执行任何操作,而无需取消保护.如果你在其他地方有保护/解除保护,现在就摆脱它; 它不是必需的.

现在,谈谈你的实际问题.只要在范围("G50")发生变化时,就可以将消息框操作限制为,而不是在不相关的内容发生变化时.

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
Run Code Online (Sandbox Code Playgroud)