Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Проблема написания функции задания цвета ячейки в VBA, которая бы работала в качестве формулы
 
Здравствуйте!

Подскажите, можно ли написать функцию задания цвета ячейки в VBA, которая бы в качестве аргументов принимала адрес ячейки и код цвета?
При этом она должна работать в качестве формулы на рабочем листе.

Я написал такой вариант:
Код
Public Function AskColor(Cell As Range, Color As Integer)
Cell.Interior.ColorIndex = Color
End Function
Но она не работает на рабочем листе в качестве формулы.
Хотя похожая функция определения цвета ячейки, где аргументом выступает адрес ячейки, работает:
Код
Public Function ColorNomInterior(Cell As Range)
ColorNomInterior = Cell.Interior.ColorIndex
End Function

Спасибо!
 
Думаю огорчу, но функция не может изменить свойство ячейки, только вернуть какое нибудь значение.
По Вашему коду - не вдаваясь в корректность - внимательно сравните эти два кода: в Вашем коде самой функции AskColor не присаивается ничего
Согласие есть продукт при полном непротивлении сторон.
 
Вы уверены, что невозможно создать функцию, меняющую свойства ячейки?
По коду согласен, но это не меняет сути вопроса.

Код можно записать более корректно, чтобы функция, что-то возвращала (неважно что):
Код
Public Function AskColor(Cell As Range, Color As Integer) 
    Cell.Interior.ColorIndex = Color
    AskColor = Cell.Interior.ColorIndex
End Function 
Ведь процедуры могут менять свойства ячейки.
Например:
Код
Sub AskColor () 
    Cells(5, 5).Interior.ColorIndex = 6
End Sub
Но процедуры не подходят, поскольку они не отображаются на рабочем листе в качестве формулы.
Поэтому задав точно такую же процедуру установки цвета ячейки как и для функции выше
Код
Sub AskColor(Cell As Range, Color As Integer)     
    Cell.Interior.ColorIndex = Color
End Sub
ей невозможно будет воспользоваться на рабочем листе.

Почему тогда функция не может менять свойства ячейки?
Может можно как-то обойти это ограничение, если оно существует?
Например, в функции вызвать процедуру, в которую в качестве аргумента передать переменные из функции?
Изменено: maxkrav - 2 Мар 2015 01:43:22
 
Цитата
maxkrav написал: Вы уверены...?
Вы знаете, теперь уже нет :). Хотя я такой не один ;)
Согласие есть продукт при полном непротивлении сторон.
 
Действительно, многие пишут, что изменять свойства ячейки через функцию невозможно.
Например, в книге Джона Уокенбаха "Excel 2010: профессиональное программирование на VBA" на стр. 290 написано: "При разработке пользовательских функций важно понимать различия между функциями, которые вызываются из других процедур VBA, и функциями, используемыми в формулах рабочего листа. Функции, используемые в формулах рабочего листа,— “пассивные”. Например, такая функция не может обрабатывать диапазоны либо изменять содержимое рабочего листа. Соответствующий практический пример приведен ниже. Можете попробовать написать функцию рабочего листа, которая изменяет содержимое ячейки. Например, рекомендуется всегда иметь под рукой формулу, которая изменяет цвет текста в ячейке в зависимости от значения этой ячейки. Однако несмотря ни на что, такую функцию написать невозможно. Что бы вы ни делали, функция всегда будет возвращать ошибку. Помните: функция возвращает значение, но не может выполнять операции над объектами.
Следует отметить, что из этого правила имеется одно исключение. Вы можете изменить текст комментария ячейки с помощью пользовательской функции VBA, код которой приведен ниже.
Function ModifyComment (Cell As Range, Cmt As String)
Cell.Comment.Text = Cmt
End Function"

Но встречаются сообщения, что можно как-то обойти эти ограничения. Например, здесь http://www.cyberforum.ru/ms-excel/thread1339420.html участник форума сказал, что "Где то в разделе по vba местные гуру советовали как обойти это ограничение". Правда, не нашел как они обошли ограничение.

Попробовал сам обойти это ограничение путем вызова процедуры в функции, но не получилось:
Код
Public Function AskColor(Cell As Range, Color As Integer)    
    SetColor(Cell, Color)
    AskColor = Cell.Interior.ColorIndex
End Function

Sub SetColor(Cell As Range, Color As Integer)   
    Cell.Interior.ColorIndex = Color
End Sub
Возможно, я где-то ошибся. Либо существует другая возможность обойти ограничение невозможности изменения свойства ячейки через функцию.

Если кто-то знает как обойти ограничение прошу написать.
 
Цитата
maxkrav написал:
Подскажите, можно ли написать функцию задания цвета ячейки в VBA, которая бы в качестве аргументов принимала адрес ячейки и код цвета?
При этом она должна работать в качестве формулы на рабочем листе.
Нельзя, но:
1. можно использовать условное форматирование;
2. с помощью обработки событий листа можно эмулировать любые функции и менять свойства объектов книги.
 
Про обход ограничения - думаю это относилось к изменению значения в другой ячейке, так можно сделать заменой. Но это работает очень непрактично.
А вот чтоб менять именно формат ячеек - такого не слышал.
 
помимо значения можно изменить еще и формат ячейки
F1 творит чудеса
 
Цитата
Hugo написал: А вот чтоб менять именно формат ячеек - такого не слышал
Игорь, рад, что немного добавлю слухов в твою копилку :-) Максим выложил выше ссылку на мою статью - там и формат и значение изменяются.

Для автора темы: не советую такие методы использовать. Это обходные пути, недокументированные. Поэтому применять их крайне не рекомендуется. Лучше присмотреться к УФ в случае, когда надо менять формат ячейки функцией. Можно даже в УФ применить UDF.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Пробовал менять цвет ячейки по алгоритму предложенному в ссылке, которую указал Максим, но цвет не меняется и не копируется из другой ячейки. Возможно потому, что у меня Excel 2013 года.
Изменено: maxkrav - 3 Мар 2015 17:55:32
Страницы: 1
Читают тему (гостей: 1)