W ten sposób się nie da.
Możesz uwzględnić różnice w API Excela i OpenOffice. Doprowadzi to do następujących dwóch rozwiązań. Pierwsze obejmuje tylko niepuste komórki w zakresie (czyli np. nie nada się do zliczania pokolorowanych komórek)
- Kod: Zaznacz cały Rozszerz widokZwiń widok
Function SumujKolory(Zakres As Range, KolorowaKomorka As Range)
zakresy = thisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
zakresy.insertByName("zakres", zakres)
num = Zakresy.Cells.CreateEnumeration()
SumujKolory = 0
kolor = KolorowaKomorka.CellBackColor
while num.hasmoreelements()
cell = num.nextelement
if cell.CellBackColor = kolor Then
SumujKolory = SumujKolory + cell.getValue()
end if
wend
End Function
Drugie działa na pełnym prostokątnym zakresie (więc wolniej), i nie działa kiedy zakres jest złożony
- Kod: Zaznacz cały Rozszerz widokZwiń widok
Function SumujKolory(Zakres As Range, KolorowaKomorka As Range)
SumujKolory = 0
kolor = KolorowaKomorka.CellBackColor
for i = zakres.RangeAddress.StartColumn to zakres.RangeAddress.EndColumn
for j = zakres.RangeAddress.StartRow to zakres.RangeAddress.EndRow
cell = zakres.getCellByPosition(i,j)
k = cell.CellBackColor
if k = kolor Then
SumujKolory = SumujKolory + cell.getValue()
end if
next j
next i
End Function
Każdą z tych funkcji możesz wywołać z procedury (makra) np. tak
- Kod: Zaznacz cały Rozszerz widokZwiń widok
sub test()
d = thisComponent
s = d.CurrentController.GetActiveSheet()
q = s.GetCellRangeByName("A1:F10")
c = s.GetCellRangeByName("B6")
n = sumujKolory(q, c)
msgbox(n)
end sub
Czego się nie da, to użyć ich jako funkcji w arkuszu.
W OpenOffice argumenty adresowe Cell albo Range przekazywane do funkcji wywoływanych poprzez formuły nie zawierają obiektów typu Cell lub odp. Range, tylko pobrane z nich tablice wartości. Wobec tego w formule możesz sprawdzić wartość innej komórki, ale nie masz dostępu do jej obiektu, a w szczególności do jej koloru tła. Pozostaje napisać makropolecenie, które załatwi sprawę.
PS. W większości przypadków konieczność pisania funkcji tego typu bierze się z pomysłu przechowywania istotnych danych w warstwie innej niż zawartość tabel. Oczywiste, że jest to możliwe, ale tak naprawdę świadczy o doraźności projektu, a konkretnie: o pomieszaniu sposobu przechowywania danych ze sposobem ich prezentowania. Z kolei chęć pisania funkcji sugeruje, że danych jest dużo. Nie znam skali projektu, ale rozważyłbym ewentualne korzyści płynące z przejścia z doraźnego modelu kolorowanego arkusza na model tabelaryczny (być może trzeba będzie dopisać formularze do obsługi).