У меня есть таблица Excel, в которой я хочу защитить некоторые ячейки от форматирования и редактирования. Все эти ячейки окрашены в определенный цвет.
Лист очень большой, поэтому я ищу способ заблокировать все эти ячейки одновременно, а затем иметь возможность выполнить массовое форматирование всех остальных ячеек, не изменяя ячейки, которые я хочу заблокировать.
Есть ли способ заставить Excel заблокировать ячейки определенного цвета?
решение1
Да, с помощью VBa... Просто скопируйте это в «ThisWorkbook» на экране Visual Basic, а затем запустите его (зеленый треугольник воспроизведения)
Sub WalkThePlank()
dim colorIndex as Integer
colorIndex = 3 'UPDATE ME TO YOUR COLOUR OR BE FED TO THE SHARKS
Dim rng As Range
For Each rng In ActiveSheet.UsedRange.Cells
Dim color As Long
color = rng.Interior.ColorIndex
If (color = colorIndex) Then
rng.Locked = True
else
rng.Locked = false 'this will remove any locks for those not in the given color
End If
Next rng
End Sub
В VBa нет возможности отмены, поэтому сначала сделайте копию файла (чтобы создать резервную копию)!
Цветовой индекс -http://dmcritchie.mvps.org/excel/colors.htm
Вышеизложенное предполагает, что у вас нет объединенных ячеек и что ваш рабочий лист не защищен.
Если вы не уверены, какой colorIndex вам нужен, то сначала воспользуйтесь этим скриптом
Sub Find()
Dim colorIndexFinder As Integer
colorIndexFinder = Range("A1").Interior.colorIndex 'CHANGE A1 to the cell with the colour you want to use
MsgBox (colorIndexFinder)
End Sub
Редактировать
Вы упомянули, что используете объединенные ячейки.
Пожалуйста попробуйте
Sub WalkThePlank()
Dim colorIndex As Integer
colorIndex = 3 'UPDATE ME TO YOUR COLOUR OR BE FED TO THE SHARKS
Dim rng As Range
For Each rng In ActiveSheet.UsedRange.Cells
Dim color As Long
color = rng.Interior.colorIndex
If (color = colorIndex) Then
If (rng.MergeCells) Then
rng.MergeArea.Locked = True
Else
rng.Locked = True
End If
Else
If (rng.MergeCells) Then
rng.MergeArea.Locked = False
Else
rng.Locked = False
End If
End If
Next rng
End Sub
решение2
я нашелэтотс помощью простого макроса:
Выделите весь лист (Ctrl+A)
и разблокируйте все ячейки, а затем используйте этот макрос, чтобы снова заблокировать цветные ячейки:
Dim c As Object
For Each c In selection
If c.ColorIndex = 6 ' 6 is for Yellow - change to the colour you want
c.Locked = True
End If
Next c
решение3
Решение VBA (Как добавить VBA в MS Office?)
Sub LockOnlyCellsWithCertainColor()
'Change to your color
Const colorToLock = 65535
Dim currentCell As Range
ActiveSheet.Cells.Locked = False
For Each currentCell In ActiveSheet.UsedRange.Cells
If currentCell.Interior.Color = colorToLock Then
If currentCell.MergeCells Then
currentCell.MergeArea.Locked = True
Else
currentCell.Locked = True
End If
End If
Next
End Sub
Sub GetBackgroundColorOfActiveCell()
Debug.Print ActiveCell.Interior.Color
MsgBox ActiveCell.Interior.Color
End Sub
решение4
Следующий способ мне подходит, если сначала снять защиту листа и установить индекс цвета на 6 для желтого цвета.
Sub Lock_by_Color()
Dim colorIndex As Integer
Dim Range As Range
colorIndex = 6
For Each Range In ActiveSheet.UsedRange.Cells
Dim color As Long
color = Range.Interior.colorIndex
If (color = colorIndex) Then
Range.Locked = True
Else
Range.Locked = False
End If
Next Range
ActiveSheet.Protect , DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowSorting:=True, AllowFiltering:=True, AllowUsingPivotTables:=True
ActiveSheet.EnableSelection = xlNoRestrictions
End Sub