Изменить BackColor у ячейки при помощи пользовательской функции

Автор denoleg, 9 марта 2014, 08:23

0 Пользователи и 1 гость просматривают эту тему.

denoleg

Здравствуйте! Уже сколько бьюсь и ничего.
Мне нужно изменить фон ячейки при помощи пользовательской функции.
Функцию вызываю так =BackColor(CELL("address";A1);B1;C1;D1)
Вот сама функция

Function BackColor(a As String, R,G,B)

Doc=ThisComponent
a=join(split(a,"$"),"")
i=split(a,".")
n=ubound(i)

If n=1 then
oSheet=Doc.Sheets.getByName(i(0))
else
oSheet = Doc.CurrentController.ActiveSheet
endif
   oCell = oSheet.getCellRangeByName(i(n))
   oCell.CellBackColor = RGB (R, G, B)
End Function

И ячейка А1 не меняет фон. В чем может быть ошибка?

Yakov


Hasim

Не работает из пользовательской функции и не будет работать.
Будет работать из макроса.

denoleg

Цитата: Hasim от 10 марта 2014, 12:04
Не работает из пользовательской функции и не будет работать.
Будет работать из макроса.
Ясно. Буду пробовать. И очень жаль что не будет работать. Может добавят такую возможность.

JohnSUN

Нет, такую возможность добавлять в Calc никто не станет. Дело в том, что твоя задумка идёт в разрез с идеологией электронных таблиц.
Главный принцип вычислений: результат помещается в ту ячейку, в которой написана формула.
А если просмотреть код твоей функции, то получается, что вычисление проводится в той ячейке, где записывается вызов функции, а результат (закраска) должен применяться к какой-то "посторонней" ячейке.
Hasim прав - с помощью пользовательской функции на текущем листе никаких изменений сделать не удастся. На время пересчета формул на листе этот лист блокируется от изменений. То есть, можно было бы раскрасить ячейки на соседнем листе или вписать в них какие-то значения, но на текущем листе добиться этого невозможно. Это ограничение введено специально, чтобы обеспечить работоспособность программы на случай возникновения циклических ссылок.
Если этот тезис понятен (нельзя приказать "покрасить вон там", но можно сказать "покрась меня, вот эту вот ячейку"), то можно перейти к реализации. Для раскрашивания ячеек существуют встроенные средства - условное форматирование и функция STYLE() - поэтому писать собственную функцию нет необходимости. Подробности в Справке
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне