Этот код должен делать то, что вы хотите. Он считывает существующий цвет из рамочной ячейки в выделении, определяет, какой следующий цвет установить, и устанавливает все цвета соответствующим образом.
Sub CycleBorderColors(Optional ByVal Reset As Boolean)
Dim BorderColor As Variant
Dim BorderPos As Variant
Dim CurrentColor As Long
Dim ColorIndex As Long
Dim Cell As Range
Dim i As Integer
BorderPos = Array(xlDiagonalDown, xlDiagonalUp, xlEdgeLeft, xlEdgeTop, _
xlEdgeBottom, xlEdgeRight, xlInsideVertical, xlInsideHorizontal)
BorderColor = Array(RGB(0, 0, 0), RGB(255, 0, 0), RGB(0, 255, 0), _
RGB(222, 111, 155), RGB(111, 111, 111))
If Reset Then
ColorIndex = Reset
Else
CurrentColor = xlNone
' read the border color of the first selected cell with a border
For Each Cell In Selection.Cells
For i = LBound(BorderPos) To UBound(BorderPos)
With Cell
If .Borders(BorderPos(i)).LineStyle <> xlNone Then
CurrentColor = .Borders(BorderPos(i)).Color
Exit For
End If
End With
Next i
If CurrentColor <> xlNone Then Exit For
Next Cell
If CurrentColor = xlNone Then
MsgBox "The selection includes no cells with borders.", _
vbInformation, "Inapplicable selection"
Exit Sub
End If
For ColorIndex = UBound(BorderColor) To 0 Step -1
If BorderColor(ColorIndex) = CurrentColor Then Exit For
Next ColorIndex
' ColorIndex will be -1 if not found
End If
ColorIndex = ColorIndex + 1 ' set next color
If ColorIndex > UBound(BorderColor) Then ColorIndex = 0
For Each Cell In Selection
For i = LBound(BorderPos) To UBound(BorderPos)
If Cell.Borders(BorderPos(i)).LineStyle <> xlNone Then
Cell.Borders(BorderPos(i)).Color = BorderColor(ColorIndex)
End If
Next i
Next Cell
End Sub
Процедура имеет необязательный аргумент, который, если задано значение True, вызывает сброс. Текущая программа устанавливает цвет границы по умолчанию. Оглядываясь назад, идея не так актуальна, потому что вы можете вызвать сброс, выполнив код 4 или меньше раз. Но когда я начинал, это казалось хорошей идеей. Теперь вы можете предпочесть удалить функцию. Самый простой способ - удалить аргумент из объявления, добавить Dim Reset As Boolean
к объявлениям переменных и оставить остальное для себя.
Пока у вас есть возможность сброса, используйте посредник для вызова процедуры , Любой из трех вариантов, показанных ниже, будет работать.
Sub CallCycleBorderColors()
CycleBorderColors
' CycleBorderColors True
' CycleBorderColors False
End Sub
Вызовите sub CallCycleBorderColors
из рабочего листа.