Strona 1 z 1

Licz Kolory

PostNapisane: Śr maja 15, 2013 2:25 pm
przez 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

PostNapisane: Śr maja 15, 2013 3:35 pm
przez 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   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).

Re: Licz Kolory

PostNapisane: Cz maja 16, 2013 8:27 am
przez 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

PostNapisane: Cz maja 16, 2013 9:13 am
przez Minio
jacako napisał(a):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 napisał(a):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

PostNapisane: Cz maja 16, 2013 9:39 am
przez 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

PostNapisane: Cz maja 16, 2013 10:12 am
przez 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

PostNapisane: Cz maja 16, 2013 1:35 pm
przez jacako
Witam,
i dziękuję za poświęcony mi czas.

Pozdrawiam Jaca

Re: Licz Kolory

PostNapisane: Śr maja 22, 2013 12:16 am
przez 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

PostNapisane: N lis 16, 2014 11:26 pm
przez 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

PostNapisane: N lis 16, 2014 11:40 pm
przez Jan_J

Re: Licz Kolory

PostNapisane: Pn lis 17, 2014 3:20 pm
przez 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

PostNapisane: Wt lis 18, 2014 12:33 am
przez 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.