Hi
OK. Try this.
Code:
Dim Cell As Range
Dim mergedRange As Range
Dim xlVer As Long
Dim dColor As Long
xlVer = Val(Application.Version)
Range("A1:Y160").Locked = False
For Each Cell In ActiveSheet.Range("A1:Y160")
If Cell.MergeCells = False Then
If Cell.FormatConditions.Count = 0 Then
If Cell.Interior.ColorIndex = 15 Then Cell.Locked = True
Else
If xlVer > 12 Then
If Cell.DisplayFormat.Interior.ColorIndex = 15 Then
If Cell.Borders.ColorIndex = xlNone Then
Cell.Locked = True
End If
End If
Else
dColor = DisplayedColor(Cell, True)
If dColor = 15 Then
'If Cell.Borders.ColorIndex = xlNone Then
Cell.Locked = True
'End If
End If
End If
End If
Else
Set mergedRange = Cell.MergeArea
If mergedRange.FormatConditions.Count = 0 Then
If mergedRange.Interior.ColorIndex = 15 Then mergedRange.Locked = True
Else
'If Cell.Address = "$O$20" Then Stop
If xlVer > 12 Then
If mergedRange.DisplayFormat.Interior.ColorIndex = 15 Then
If mergedRange.Borders(xlEdgeTop).ColorIndex = xlNone Then
mergedRange.Locked = True
End If
End If
Else
dColor = DisplayedColor(mergedRange.Cells(1), True)
If dColor = 15 Then
If mergedRange.Borders(xlEdgeTop).ColorIndex = xlNone Then
mergedRange.Locked = True
End If
End If
End If
End If
End If
Next
in a standard module, use Rick's Function
Code:
Option Explicit
' Arguments
' ----------------
' Cell - Required Range, not a String value, for a **single** cell
'
' CellInterior - Optional Boolean (Default = True)
' True makes function return cell's Interior Color or ColorIndex based on
' the ReturnColorIndex argument False makes function return Font's Color or
' ColorIndex based on the ReturnColorIndex argument
'
' ReturnColorIndex - Optional Boolean (Default = True)
' True makes function return the ColorIndex for the cell property determined
' by the CellInterior argument False make function return the Color for the
' cell property determined by the CellInterior argument
'
Function DisplayedColor(Cell As Range, Optional CellInterior As Boolean = True, _
Optional ReturnColorIndex As Long = True) As Long
Dim X As Long, Test As Boolean, CurrentCell As String
If Cell.Count > 1 Then Err.Raise vbObjectError - 999, , "Only single cell references allowed for 1st argument."
CurrentCell = ActiveCell.Address
For X = 1 To Cell.FormatConditions.Count
With Cell.FormatConditions(X)
If .Type = xlCellValue Then
Select Case .Operator
Case xlBetween: Test = Cell.Value >= Evaluate(.Formula1) And Cell.Value <= Evaluate(.Formula2)
Case xlNotBetween: Test = Cell.Value <= Evaluate(.Formula1) Or Cell.Value >= Evaluate(.Formula2)
Case xlEqual: Test = Evaluate(.Formula1) = Cell.Value
Case xlNotEqual: Test = Evaluate(.Formula1) <> Cell.Value
Case xlGreater: Test = Cell.Value > Evaluate(.Formula1)
Case xlLess: Test = Cell.Value < Evaluate(.Formula1)
Case xlGreaterEqual: Test = Cell.Value >= Evaluate(.Formula1)
Case xlLessEqual: Test = Cell.Value <= Evaluate(.Formula1)
End Select
ElseIf .Type = xlExpression Then
Application.ScreenUpdating = False
Cell.Select
Test = Evaluate(.Formula1)
Range(CurrentCell).Select
Application.ScreenUpdating = True
End If
If Test Then
On Error Resume Next
If CellInterior Then
DisplayedColor = IIf(ReturnColorIndex, .Interior.ColorIndex, .Interior.Color)
Else
DisplayedColor = IIf(ReturnColorIndex, .Font.ColorIndex, .Font.Color)
End If
If Err.Number <> 0 Then GoTo 1
Exit Function
End If
End With
Next
1:
If CellInterior Then
DisplayedColor = IIf(ReturnColorIndex, Cell.Interior.ColorIndex, Cell.Interior.Color)
Else
DisplayedColor = IIf(ReturnColorIndex, Cell.Font.ColorIndex, Cell.Font.Color)
End If
Err.Clear
End Function
Bookmarks