Это можно сделать с помощью события изменения рабочего листа в VBA. Я начал создавать простой пример для вас, но я понял, что ваш клиент, вероятно, захочет откатить любое выделение после того, как они проверили ваши изменения. Итак, я решил сделать целую рабочую модель, которая делает все. Вот шаги, которые вы должны будете выполнить:
Нажмите Alt+F11, чтобы открыть редактор VBA в Excel. В обозревателе объектов (в левой части окна VBA) дважды щелкните лист, который вы будете редактировать. Вставьте следующий код в открывшееся текстовое поле.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet, ws2 As Worksheet
Dim i As Boolean
Application.ScreenUpdating = False
'Create Change Log if one does not exist.
i = False
For Each ws In ThisWorkbook.Worksheets
If ws.Name = "Change Log" Then
i = True
Exit For
End If
Next ws
If Not i Then
Set ws2 = ThisWorkbook.Worksheets.Add
ws2.Visible = xlSheetHidden
ws2.Name = "Change Log"
ws2.Range("A1") = "Sheet"
ws2.Range("B1") = "Range"
ws2.Range("C1") = "Old Text Color"
Else
Set ws2 = Sheets("Change Log")
End If
'Store previous color data in change log for rollback.
ws2.Range("A1").Offset(ws2.UsedRange.Rows.Count, 0) = Target.Worksheet.Name
ws2.Range("B1").Offset(ws2.UsedRange.Rows.Count - 1, 0) = Target.Address
ws2.Range("C1").Offset(ws2.UsedRange.Rows.Count - 1, 0) = Target.Font.Color
'Change font color to red.
Target.Font.Color = 255
Application.ScreenUpdating = True
End Sub
Этот код изменит цвет шрифта на красный для любой ячейки, значение которой вы измените. Он не изменит цвет шрифта, если вы измените только формат ячейки. Кроме того, он не будет автоматически изменять цвет шрифта зависимых ячеек. Последнее может быть сделано, но я оставлю это вам, если вы хотите такого поведения.
Этот код также создает скрытый лист журнала изменений и записывает адрес и исходный цвет шрифта ячейки, которая была изменена.
Обратите внимание, что этот код работает только для изменений в этом конкретном листе. Если вы хотите отслеживать изменения во всей книге, вы можете вставить этот же код в модуль листа для каждого листа.
Код для отката любой подсветки должен быть размещен в отдельном модуле. В редакторе VBA перейдите к Вставка >> Модуль. Вставьте следующий код в новый модуль.
Sub rollbackHILITE()
Dim sht As Worksheet, cl As Worksheet
Dim j As Long, roll() As Variant
Dim del As Integer
Application.ScreenUpdating = False
'Find Change Log. If it doesn't exist, user is prompted and exits sub.
For Each sht In ThisWorkbook.Worksheets
If sht.Name = "Change Log" Then
Set cl = sht
Exit For
End If
Next sht
If cl Is Nothing Then
MsgBox "Change Log not found!"
Exit Sub
End If
'Return font colors to original form by stepping backward through change log.
If cl.UsedRange.Rows.Count > 1 Then
roll = cl.Range("A2:C2").Resize(cl.UsedRange.Rows.Count - 1, 3)
For j = UBound(roll, 1) To 1 Step -1
Set sht = Sheets(roll(j, 1))
sht.Range(roll(j, 2)).Font.Color = roll(j, 3)
Next j
End If
Application.ScreenUpdating = True
'Prompt User to keep or delete change log after rollback.
del = MsgBox("Delete Change Log?", vbOKCancel, "Finish Rollback")
If del = 1 Then
cl.Delete
End If
End Sub
Этот код можно запустить из меню «Макросы» в Excel. Он просто возвращает цвет шрифта выделенных ячеек обратно к их исходным цветам, а затем удаляет журнал изменений, если пользователь одобряет его.