У меня есть UDF в сочетании с IF-выражением, чтобы поместить «X» в ячейку с цветом фона, формула не пересчитывается при изменении цвета фона, как я могу использовать Private Sub Workbook_SheetChange
так, чтобы каждый раз, когда я меняю цвет фона ячейки, все формулы пересчитываются.Пересчитать при изменении фона ячейки
формула проста =IF(CELLCOLOR(M2)="Custom color or no fill","","x"
Вот UDF
Function CELLCOLOR(rCell As Range, Optional ColorName As Boolean)
Application.Volatile
Dim strColor As String
Dim iIndexNum As Integer
Select Case rCell.Interior.ColorIndex
Case 1
strColor = "Black"
iIndexNum = 1
Case 53
strColor = "Brown"
iIndexNum = 53
Case 52
strColor = "Olive Green"
iIndexNum = 52
Case 51
strColor = "Dark Green"
iIndexNum = 51
Case 49
strColor = "Dark Teal"
iIndexNum = 49
Case 11
strColor = "Dark Blue"
iIndexNum = 11
Case 55
strColor = "Indigo"
iIndexNum = 55
Case 56
strColor = "Gray-80%"
iIndexNum = 56
Case 9
strColor = "Dark Red"
iIndexNum = 9
Case 46
strColor = "Orange"
iIndexNum = 46
Case 12
strColor = "Dark Yellow"
iIndexNum = 12
Case 10
strColor = "Green"
iIndexNum = 10
Case 14
strColor = "Teal"
iIndexNum = 14
Case 5
strColor = "Blue"
iIndexNum = 5
Case 47
strColor = "Blue-Gray"
iIndexNum = 47
Case 16
strColor = "Gray-50%"
iIndexNum = 16
Case 3
strColor = "Red"
iIndexNum = 3
Case 45
strColor = "Light Orange"
iIndexNum = 45
Case 43
strColor = "Lime"
iIndexNum = 43
Case 50
strColor = "Sea Green"
iIndexNum = 50
Case 42
strColor = "Aqua"
iIndexNum = 42
Case 41
strColor = "Light Blue"
iIndexNum = 41
Case 13
strColor = "Violet"
iIndexNum = 13
Case 48
strColor = "Gray-40%"
iIndexNum = 48
Case 7
strColor = "Pink"
iIndexNum = 7
Case 44
strColor = "Gold"
iIndexNum = 44
Case 6
strColor = "Yellow"
iIndexNum = 6
Case 4
strColor = "Bright Green"
iIndexNum = 4
Case 8
strColor = "Turqoise"
iIndexNum = 8
Case 33
strColor = "Sky Blue"
iIndexNum = 33
Case 54
strColor = "Plum"
iIndexNum = 54
Case 15
strColor = "Gray-25%"
iIndexNum = 15
Case 38
strColor = "Rose"
iIndexNum = 38
Case 40
strColor = "Tan"
iIndexNum = 40
Case 36
strColor = "Light Yellow"
iIndexNum = 36
Case 35
strColor = "Light Green"
iIndexNum = 35
Case 34
strColor = "Light Turqoise"
iIndexNum = 34
Case 37
strColor = "Pale Blue"
iIndexNum = 37
Case 39
strColor = "Lavendar"
iIndexNum = 39
Case 2
strColor = "White"
iIndexNum = 2
Case Else
strColor = "Custom color or no fill"
End Select
If ColorName = False Or strColor = "Custom color or no fill" Then
CELLCOLOR = strColor
Else
CELLCOLOR = iIndexNum
End If
'All credits go to the dude who wrote this code which I'm not
End Function
В Excel не предусмотрено событие, вызванное изменением цвета в ячейке. Тем не менее, есть пара возможностей для решения проблемы. В принципе, если ваш диапазон ячеек A1: D50, то настройте параллельный диапазон в AA1: AD50, и для каждой ячейки используйте ваш UDF, чтобы заполнить эти параллельные ячейки цветом строки или indexNumber. Затем, когда ваши данные изменяются (т. Е. «Worksheet_Change»), ваша область изменения должна смотреть на эту параллельную область и действовать соответствующим образом. – PeterT
Возможно, вы можете использовать Worksheet_SelectionChange для отслеживания при выборе ячейки, а затем, когда выбор снова изменится, проверьте, изменился ли цвет этого диапазона. Или, если ваш используемый диапазон не огромен, просто вызовите пересчет при каждом изменении выбора. –
Проверьте эту ссылку - использует словарь для захвата состояния формата ячейки http://stackoverflow.com/questions/21342408/how-to-detect-changes-in-cell-format. Возможно, вам понадобится ссылаться на библиотеку 'Scripting.Runtime', чтобы получить объект Dictionary. –