2016-06-03 2 views
1

У меня есть 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 
+0

В Excel не предусмотрено событие, вызванное изменением цвета в ячейке. Тем не менее, есть пара возможностей для решения проблемы. В принципе, если ваш диапазон ячеек A1: D50, то настройте параллельный диапазон в AA1: AD50, и для каждой ячейки используйте ваш UDF, чтобы заполнить эти параллельные ячейки цветом строки или indexNumber. Затем, когда ваши данные изменяются (т. Е. «Worksheet_Change»), ваша область изменения должна смотреть на эту параллельную область и действовать соответствующим образом. – PeterT

+1

Возможно, вы можете использовать Worksheet_SelectionChange для отслеживания при выборе ячейки, а затем, когда выбор снова изменится, проверьте, изменился ли цвет этого диапазона. Или, если ваш используемый диапазон не огромен, просто вызовите пересчет при каждом изменении выбора. –

+0

Проверьте эту ссылку - использует словарь для захвата состояния формата ячейки http://stackoverflow.com/questions/21342408/how-to-detect-changes-in-cell-format. Возможно, вам понадобится ссылаться на библиотеку 'Scripting.Runtime', чтобы получить объект Dictionary. –

ответ

1

Этот код идет в модуле sheeet кода (не в обычном модуле)

Отредактируйте "A1: D50" для покрытия диапазона, содержащего цвет вашей ячейки UDF

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Me.Range("A1:D50").Calculate 
End Sub 
+0

Если это реализовано, возьмите Application.Volatile от функции, иначе это займет много времени. – Sgdva

Смежные вопросы