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