Shape Fill Changer
Лист1: Карта (Ливерпуль)
Формула Excel для ячейки E2 - это:
=D2-TODAY()+C2
Лист 2: Данные
Перед использованием этого кода внимательно изучите раздел константы изменить его в соответствии с вашими потребностями.Вставьте его в модуль и дополнительно добавьте соответствующий код ниже.
Имена фигур привязаны к идентификаторам кабелей и состоят из имени ядра формы "Cable" и идентификатора кабеля, например, если идентификатор кабеля равен 7, тогдаформа называется «Cable7».
Код написан так, что если вы меняете заголовок CABLE ID или DUE DAYS в листе данных, вы должны также изменить его в разделе констант.С другой стороны, вы можете вставить новые столбцы и перегруппировать столбцы, и код по-прежнему будет работать.
Option Explicit
Sub ShapeFillChanger()
Const cStrCableId As String = "CABLE ID" ' Cable ID Column Header
Const cStrDaysData As String = "DUE DAYS" ' Days Data Column Header
Const cStrMap As String = "Sheet1" ' Map Worksheet Name
Const cStrData As String = "Sheet2" ' Data Worksheet Name
Const cStrShape As String = "Cable" ' Shapes Core Name
Dim objCableFirst As Range ' Cable Number First Cell (incl. Header)
Dim objCableLast As Range ' Cable Number Last Cell
Dim objDays As Range ' Days Range
Dim objCell As Range ' Each Cell in Days Range
Dim lngRGB As Long ' RGB Color Value
Dim intDays As Integer ' Days Column Number
' Process worksheet containing data (Data Worksheet).
With ThisWorkbook.Worksheets(cStrData)
' Find first cell containing cStrCableId.
Set objCableFirst = .Cells _
.Find(What:=cStrCableId, After:=.Cells(.Rows.Count, .Columns.Count), _
LookIn:=xlFormulas, Lookat:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext)
' Find last cell containing data in column where cStrCableId was found.
Set objCableLast = .Range(.Cells(1, objCableFirst.Column), _
.Cells(.Rows.Count, objCableFirst.Column)) _
.Find(What:="*", After:=.Cells(1, objCableFirst.Column), _
LookIn:=xlFormulas, Lookat:=xlWhole, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious)
' Find first column containing cStrDaysData in row where cStrCabelId was
' found.
intDays = .Range(.Cells(objCableFirst.Row, 1), _
.Cells(objCableFirst.Row, .Columns.Count)) _
.Find(What:=cStrDaysData, _
After:=.Cells(objCableFirst.Row, .Columns.Count), _
LookIn:=xlFormulas, Lookat:=xlWhole, _
SearchOrder:=xlByRows, SearchDirection:=xlNext).Column
' Create reference to the range of Days Data (Days Range).
Set objDays = .Range(.Cells(objCableFirst.Row + 1, intDays), _
.Cells(objCableLast.Row, intDays)) ' " + 1" to exclude Header.
' Check each cell value in Days Range and apply changes to Map Worksheet.
For Each objCell In objDays
Select Case objCell.Value
Case Is <= 0 ' Red: SchemeColor = 2, RGB (255, 0, 0)
lngRGB = RGB(255, 0, 0)
Case Is <= 30 ' Yellow: SchemeColor = 5, RGB (255, 255, 0)
lngRGB = RGB(255, 255, 0)
Case Is > 30 ' Green: SchemeColor = 3, RGB (0, 255, 0)
lngRGB = RGB(0, 255, 0)
Case Else
End Select
With ThisWorkbook.Worksheets(cStrMap).Shapes(cStrShape & _
.Cells(objCell.Row, objCableFirst.Column))
.Fill.ForeColor.RGB = lngRGB
End With
Next
End With
End Sub
Для автоматического запуска приведенного выше кода каждый раз, когда в Таблице данных вносятся изменения в VBEдобавьте следующий код к листу ' Sheet2 ' code:
Private Sub Worksheet_Calculate()
ShapeFillChanger
End Sub
Когда вычисляется таблица данных, цвета на листе карты будут обновляться.
Так как я решил, что карта является организатором шоу, я поместил ее в лист "Sheet1".