2

Есть ли способ настроить, как Excel выделяет ячейки при отслеживании изменений? Мой клиент попросил нас «выделить все, что вы изменили, изменив цвет текста на красный», и я хотел бы реализовать это. В настоящее время я ищу способ сделать это с VBA, и моя мысль:

if (current cell has changed) and (changed has NOT been approved) then
    set color of current cell = red
else 
    remove color of current cell. 
end if  

Любые предложения приветствуются!

1 ответ1

5

Это можно сделать с помощью события изменения рабочего листа в 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. Он просто возвращает цвет шрифта выделенных ячеек обратно к их исходным цветам, а затем удаляет журнал изменений, если пользователь одобряет его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .