Отображение старых и новых значений для ячейки

У меня есть рабочий лист, в котором регистрируются изменения, внесенные пользователями в ячейки. Это происходит следующим образом

Public OldVal As String
Public NewVal As String


Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
OldVal = Target.Value
End Sub


Private Sub Worksheet_Change(ByVal Target As Range)
Dim LDate As String

If Target.Cells.Count > 1 Then Exit Sub
NewVal = Target.Value
Sheets("corrections").Cells(Rows.Count, "A").End(xlUp)(2).Value = Now & "_Sheet " & ActiveSheet.Name & " Cell " & Target.Address(0, 0) & " was changed from '" & OldVal & "' to '" & NewVal & "'"
OldVal = ""
NewVal = ""
End Sub

Проблема в том, что по какой-то причине он никогда не будет отображать предыдущее значение. он выведет его только потому, что ячейка листа FA B5 была изменена с '' на '12', даже если, например, 10 было в ячейке ранее.

Мне также было любопытно узнать, есть ли способ сделать так, чтобы этот код не работал постоянно. Я бы предпочел иметь кнопку, которую вы нажимаете, и в этот момент она инициирует и начинает регистрировать изменения.

Спасибо


person imageicb    schedule 04.10.2013    source источник
comment
Если вы используете xl2007+, то Target.Cells.Count может привести к ошибке. Вместо этого используйте Target.Cells.CountLarge.   -  person Siddharth Rout    schedule 04.10.2013


Ответы (3)


Я получил ваш опубликованный код для работы с очень небольшим изменением:

Public OldVal As String
Public NewVal As String

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Cells.Count > 1 Or IsEmpty(Target) Then Exit Sub
    OldVal = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim LDate As String
    If Target.Cells.Count > 1 Then Exit Sub
    NewVal = Target.Value
    Application.EnableEvents = False
        Sheets("corrections").Cells(Rows.Count, "A").End(xlUp)(2).Value = Now & "_Sheet " & ActiveSheet.Name & " Cell " & Target.Address(0, 0) & " was changed from '" & OldVal & "' to '" & NewVal & "'"
    Application.EnableEvents = True
    OldVal = ""
    NewVal = ""
End Sub

Что касается вашего второго вопроса, начните с:

Application.EnableEvents = False

Привяжите кнопку к макросу следующим образом:

Sub StartLogging()
    Application.EnableEvents = True
End Sub
person Gary's Student    schedule 04.10.2013
comment
Application.EnableEvents = True перед End Sub :) - person David Zemens; 04.10.2013
comment
@DavidZemens: Это не поможет, если есть ошибка. Вы всегда должны использовать обработку ошибок, когда используете Worksheet_Change или обрабатываете события. ПОСМОТРЕТЬ ЭТО - person Siddharth Rout; 04.10.2013
comment
@SiddharthRout +1 ваше предложение действительно повторно включает события, оно также добавляет обработку ошибок. Это хорошо, но принципиально ему нужно повторно активировать события, иначе ему придется запускать макрос StartLogging после каждого события изменения. - person David Zemens; 04.10.2013

Ваш код у меня работает нормально. Что касается макроса включения/отключения, вам просто нужно вставить эту строку перед (/над) каждым IF (в обоих ваших макросах). Необязательная проверка для более подходящей ячейки для хранения параметра «Да/Нет» (а не «X1»):

If Sheets("corrections").Range("X1") <> "Yes" Then Exit Sub
' where you can change X1 for a more appropriate cell

Чтобы создать кнопки, просто добавьте формы/объекты и назначьте макросы ниже:

Sub Enable_Logs()
Sheets("corrections").Range("X1").Value = "Yes"
End Sub
Sub Disable_Logs()
Sheets("corrections").Range("X1").Value = "No"
End Sub

Примечание! Чтобы добавить кнопки с назначенным им макросом, нажмите Alt + N, +SH и выберите фигуру. Затем щелкните правой кнопкой мыши фигуру > Назначить макрос (и выберите соответствующие макросы). Примечание! при первом запуске макроса необходимо вручную установить значение "Да" в ячейке X1.

person Takedasama    schedule 04.10.2013
comment
Спасибо, оба они работали как шарм. Я очень ценю это. - person imageicb; 08.10.2013

Проблема, почему мой OldVal не появлялся, заключалась в том, что он хранился в массиве. Поэтому, когда я сказал ему посмотреть на OldVal(1, 1), он работает так, как должен. Спасибо за помощь. Окончательный рабочий код:

Public OldVal As String Public NewVal As String

Private Sub Worksheet_SelectionChange(ByVal Target As Range) Если Sheets("исправления").Range("G1") ‹> "Yes" Then Exit Sub OldVal = Target.Value2

Конец сабвуфера

Private Sub Worksheet_Change(ByVal Target As Range) If Sheets("исправления").Range("G1") ‹> "Yes" Then Exit Sub If Target.Cells.CountLarge > 1 Then Exit Sub NewVal = Target.Value Sheets(" исправления").Cells(Rows.Count, "A").End(xlUp)(2).Value = Now & "_Sheet" & ActiveSheet.Name & "Cell" & Target.Address(0, 0) & "было изменено с '" & OldVal(1, 1) & "' на '" & NewVal & "'"

OldVal = ""
NewVal = ""

Конец сабвуфера

person imageicb    schedule 09.10.2013