Strona 1 z 1
Licz Kolory
: śr maja 15, 2013 2:25 pm
autor: jacako
Witam,
próbuje uruchomić funkcje sumowania komórek wg wskazanych kolorów. W excellu to działa prawidłowo, natomiast w Libre już nie. Proszę o wskazówki. Poniżej formuła funkcji:
Function SumujKolory(Zakres As Range, KolorowaKomorka As Range)
SumujKolory=0
For Each cells in Zakres
if cell.Interior.Color = KolorowaKomorka.Interior.Color Then
SumujKolory = SumujKolory + cell.Value
end if
next
End Function
Re: Licz Kolory
: śr maja 15, 2013 3:35 pm
autor: Jan_J
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
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
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
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).
Re: Licz Kolory
: czw maja 16, 2013 8:27 am
autor: jacako
Witam,
próbowałem obu rozwiązań podanych przez Ciebie i niestety LibreOffice zwraca błąd w postaci "Argument nie jest opcjonalny" dla wiersza:
zakresy.insertByName("zakres", zakres)
oraz
kolor = KolorowaKomorka.CellBackColor
Dla wyjaśnienia podam, że formuła jest potrzebna do zliczania wartości wpisanych do komórek, które są odpowiednio pokolorowane, i z całego arkusza ma wykonać operację sumowania w zależności od koloru komórki.
Proszę o podpowiedź.
Pozdrawiam Jaca
Re: Licz Kolory
: czw maja 16, 2013 9:13 am
autor: Minio
jacako pisze:Dla wyjaśnienia podam, że formuła jest potrzebna do zliczania wartości wpisanych do komórek, które są odpowiednio pokolorowane
Wpisane wartości są pokolorowane czy komórki (ich tło) są pokolorowane?
jacako pisze:i z całego arkusza ma wykonać operację sumowania w zależności od koloru komórki.
Ujmę to, co chciał przekazać Jan_J, dobitniej: dlaczego te komórki w ogóle są pokolorowane?
Przechowujesz za pomocą koloru jakąś informację. Może jest Ci łatwiej ją przechowywać w ten sposób, ale w takim wypadku tę samą informację można poznać w inny sposób (choćby bardziej skomplikowany). Może jest to jedyny sposób jej przechowywania, ale w takim wypadku jest to działanie krótkowzroczne. I właśnie doszedłeś do momentu w którym przekonujesz się, dlaczego jest krótkowzroczne.
Re: Licz Kolory
: czw maja 16, 2013 9:39 am
autor: jacako
Witam,
tło komórki jest pokolorowane.
Chodzi o to aby nie rozbudowywać tabelarycznie danych, gdyż np. musielibyśmy tworzyć osobną kolumnę dla kilku danych, a w ten sposób możemy z zaznaczonego zakresu wykonać sumę.
Dobrze by było jeżeli w Libre też ta funkcja będzie działać. W Excelu to działa. No cóż nie jestem programistą lecz jedynie użytkownikiem, który próbuje czasami bardziej zaawansowanych technik obsługi programu.
Pozdrawiam JACA
Re: Licz Kolory
: czw maja 16, 2013 10:12 am
autor: Jan_J
Każda z moich funkcji przyjmuje 2 argumenty typu obiektowego.
Znaczy to, że (1) trzeba ją wywołać z dwoma parametrami, na przykład tak jak w makrze załączonym pod spodem; (2) argumenty muszą być obiektami, to znaczy że użycie tych funkcji w formułach nie jest możliwe. Open|Libre Calc nie daje możliwości dostępu do obiektów poprzez funkcje wywoływane z formuł, o czym już napisałem.
Komunikat "Argument nie jest opcjonalny" sugeruje, że chcesz wywołać funkcję bez argumentu, np. uruchamiając ją bezpośrednio z poziomu edytora Basica.
Re: Licz Kolory
: czw maja 16, 2013 1:35 pm
autor: jacako
Witam,
i dziękuję za poświęcony mi czas.
Pozdrawiam Jaca
Re: Licz Kolory
: śr maja 22, 2013 12:16 am
autor: belstar
Witam
Wstawiam przykład rozwiązania twojego problemu za pomocą formuł użytkownika w formie krótkiego poradnika. Jan_J ma racje, że formuły nie mają dostępu do obiektów, ale jest gościu co z tym sobie poradził, a ja je tylko lekko przerobiłem.
Mam nadzieje że skorzystają na tym rozwiązaniu wszyscy zainteresowani. W świecie Excela wcale nie tak rzadko jest to rozwiązanie stosowane, więc teraz w Ooo może być też.
Re: Licz Kolory
: ndz lis 16, 2014 11:26 pm
autor: Kotek
A w jaki sposób stożyć wiele zakresów (multi range) by przeprowadzić jakieś działanie, np. nadać kolor tła za jednym razem w kilku zakresach?
Re: Licz Kolory
: ndz lis 16, 2014 11:40 pm
autor: Jan_J
Re: Licz Kolory
: pn lis 17, 2014 3:20 pm
autor: Kotek
Tak, rozumiem sam CellRange, mi raczej chodziło jak stworzyć kilka Takich CellRange, czy ma to być tablica czy coś innego żeby np. dla Range1=A1:D3, Range2=F2:I5, Range3=B6:E9 , wywołać jednym poleceniem i np. nadać Color(Range1,Range2,Range3)?
Re: Licz Kolory
: wt lis 18, 2014 12:33 am
autor: Jan_J
CellRange to pojedynczy prostokątny zakres. Poszukaj informacji o CellRanges.
Np.
https://wiki.openoffice.org/wiki/Docume ... _Container
http://api.libreoffice.org/docs/idl/ref ... anges.html
Nigdy tego nie używałem, ale z opisu wynika, że dziedziczy interfejsy właściwości komórek i zakresów. To znaczy, gdyby RR był typu CellRanges, to wystarczyłoby zaklęcie w rodzaju RR.CellBackColor = ... Co by logiczne było z punktu widzenia obiektowości.
Popatrz jeszcze tu:
http://www.oooforum.org/forum/viewtopic.phtml?t=187201
oooforum bywa dostępne nieregularne, ale ostatnio nie jest najgorzej.