Событие изменения рабочего листа Excel VBA приводит к тому, что окно сообщения появляется несколько раз - PullRequest
0 голосов
/ 05 октября 2018

Приведенный ниже код проверяет, имеет ли значение определенная ячейка, прежде чем изменить цвет на исходный цвет листа.Изменяя цвет с желтого на оригинальный цвет листа, пользователь может печатать.Проблема заключается в том, что после ввода значения окно сообщения продолжает появляться, когда что-либо еще в форме изменяется.Должно ли окно сообщения располагаться вне события изменения рабочего листа?Я новичок в программировании, поэтому любая помощь приветствуется!

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 голосов
/ 05 октября 2018

Прежде всего, прекратите защищать / снимать защиту листа каждый раз, когда что-то меняется.Поместите этот код в личную таблицу кодов рабочего листа вместе с Worksheet_Change и запустите его один раз.

private sub protectOnce()
    me.Unprotect Password:="Anthem"
    me.Protect Password:="Anthem", AllowFormattingRows:=True, UserInterfaceOnly:=True
end sub

Теперь вы можете делать все, что хотите, с рабочим листом с помощью 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
0 голосов
/ 05 октября 2018

Вы можете попробовать это.Он сработает только при изменении 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
0 голосов
/ 05 октября 2018

отключить события в вашем коде

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...