2015-05-29 2 views
9

Я видел, как многие пользователи задавали вопросы, пытаясь изменить цвета ячеек с помощью пользовательских функций. Мне всегда казалось, что это невозможно сделать. Мое понимание заключалось в том, что пользовательская функция не может изменять какие-либо свойства ячейки, кроме значения ячейки, содержащей формулу. Субботы - это то, что сами меняют ячейки.Пользовательская функция для изменения цвета ячейки

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

Function ColorCell(rng As Range) 
If rng.Value = 1 Then 
    ColorCell = False 
Else 
    ColorCell = True 
    rng.Interior.ColorIndex = 3 
End If 
End Function 

Если я вхожу функцию в клетке, я в состоянии добиться ожидаемых результатов, клетки не меняют цвет. Однако, если я использую кнопку «Формулы»> «Вставить функцию» и перейдите к моей формуле, чтобы вставить ее таким образом, она делает цвет целевых ячеек.
Cell Color Function

Как это возможно, и почему функция ведет себя по-разному, когда вводится по-разному?

EDIT: это был протестирован с помощью Excel 2007

+0

Я не знаю ответа на это, но заметьте, что если вы измените значения ячейки, это не будет измените окраску даже в нижнем корпусе. Поэтому, если вы меняете ячейку A11 на 1, ячейка остается красной. – OpiesDad

+0

Правильно, обновление самой функции не происходит. За исключением случаев, когда вы возвращаетесь и повторно используете «Insert Function», он * будет * обновлять значение/цвет. – TMH8885

+3

'Я обнаружил, что это не всегда так.« Правда :) Вы видели [Это] (http://stackoverflow.com/questions/23433096/using-a-udf-in-excel-to-update-the- рабочий лист) –

ответ

2

использовать этот код ... просто заменить имя листа и попытаться

Sheets("sheet_name").range(j:j).clear 

for j=2 to 15 
if Sheets("sheet_name").Cells(j, 1).value=1 then 

else 

Sheets("sheet_name").Cells(j, 1).Interior.ColorIndex = 3 
next j 
0

Я использую Worksheet_Change событие для обнаружения изменения значения в рабочем диапазоне. Пример. Я хочу что-то сделать, когда диапазон A1: A5 был изменен. Я использую ниже событие.

Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Range(<Your working range>)) Is Nothing Then 'Define range that you want to do 
     'Statement here 
     ... 

    End If 
End Sub 

Когда значение диапазона было изменено. Он выполнит ваш код.

И по-другому. Используйте условное форматирование.

0

Как мы все узнаем рано или поздно, в пользовательских функциях вы не можете получить доступ к элементам, которые напрямую меняют вещи в вашей электронной таблице.

Но попробуйте это:

Dim ColorMeTarget As Range, ColorMeVal As Long 

Public Function ColorMe(ByVal TargetRange As Range, ByVal ColVal As Long) 
    Set ColorMeTarget = TargetRange 
    ColorMeVal = ColVal 
    ColorMe = ColVal 
End Function 

Public Sub ColorMeSub() 
    Application.OnTime Now + TimeValue("00:00:05"), "ColorMeSub" 
    If ColorMeTarget.Interior.Color <> ColorMeVal Then ColorMeTarget.Interior.Color = ColorMeVal 
End Sub 

При запуске суб-первых, он будет постоянно сканировать статические переменные ColorMeTarget и ColorMeVal, чтобы увидеть, если есть изменения. Этим значениям будет задана функция ColorMe. Некоторый дополнительный код необходим, если ColorMeTarget еще не инициализирован.

Если вы умнее, вы можете сначала проверить функцию, чтобы увидеть, действительно ли произошло изменение, и добавить новые запросы раскраски в стек. Ваш reoccurring sub может тогда «догнать», особенно если у вас много таких функций.

Теперь вы можете добавить всевозможные дополнительные элементы управления в вашу функцию/макрос - EVEN STUFF НЕ ПОКРЫВАЕТСЯ ПОСЛЕДНИМИ ВЕРСИЯМИ «УСЛОВНОЕ ОБРАЩЕНИЕ» !!! УРА!!!!

Что-то попробовать: В некоторых из моих автоматизированных макросов я могу установить OnTime через функцию, но не могу заставить ее работать здесь. Было бы чище иметь функцию, устанавливающую OnTime, и не иметь вспомогательную подсистему, требующую инициализации.

0

также может попробовать метод не-сценарий автоматической окраски клетки на основе состояния клетки (так называемый Условное форматирование):

highlight desired range & click "conditional formatting from the toolbar

use either an established rule or make a new rule

note options on rule types; I selected one to simply format the range based on cell contents. You can format based on a formula as well. Set the conditions to test ... in this case I said the condition is when a cell value is more than 5. Then click on format and set the desire format whether it be a font change or shading of the cell, etc. Here I selected to shade the cell a color of green when above 5 Here is the result. You can delete the contents of the cells without deleting the conditional formatting set for the cells.

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