Licz Kolory

Makropolecenia i funkcje w języku Basic

Licz Kolory

Postprzez jacako » Śr maja 15, 2013 2:25 pm

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
WIN 7 64 Bit, LibreOffice 4.0.3.3
jacako
 
Posty: 4
Dołączył(a): Śr maja 15, 2013 2:21 pm

Re: Licz Kolory

Postprzez Jan_J » Śr maja 15, 2013 3:35 pm

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).
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3989
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Licz Kolory

Postprzez jacako » Cz maja 16, 2013 8:27 am

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
WIN 7 64 Bit, LibreOffice 4.0.3.3
jacako
 
Posty: 4
Dołączył(a): Śr maja 15, 2013 2:21 pm

Re: Licz Kolory

Postprzez Minio » Cz maja 16, 2013 9:13 am

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.
Mój blog o używaniu LibreOffice
LibreOffice 4.2.6, Debian testing amd64
Minio
 
Posty: 323
Dołączył(a): Śr sie 01, 2012 1:48 am
Lokalizacja: (Poznań|Dziwnów), Polska

Re: Licz Kolory

Postprzez jacako » Cz maja 16, 2013 9:39 am

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
WIN 7 64 Bit, LibreOffice 4.0.3.3
jacako
 
Posty: 4
Dołączył(a): Śr maja 15, 2013 2:21 pm

Re: Licz Kolory

Postprzez Jan_J » Cz maja 16, 2013 10:12 am

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.
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3989
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Licz Kolory

Postprzez jacako » Cz maja 16, 2013 1:35 pm

Witam,
i dziękuję za poświęcony mi czas.

Pozdrawiam Jaca
WIN 7 64 Bit, LibreOffice 4.0.3.3
jacako
 
Posty: 4
Dołączył(a): Śr maja 15, 2013 2:21 pm

Re: Licz Kolory

Postprzez belstar » Śr maja 22, 2013 12:16 am

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ż.
Załączniki
suma_wg_koloru_komórki.ods
(49.24 KiB) Pobrane 2080 razy
LibreOffice 5.1.2.2 Ubuntu 16 LTS
belstar
 
Posty: 648
Dołączył(a): Cz mar 17, 2011 9:08 am

Re: Licz Kolory

Postprzez Kotek » N lis 16, 2014 11:26 pm

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?
Dziękuję i pozdrawiam.
OpenOffice 3.1
Kotek
 
Posty: 14
Dołączył(a): Cz paź 02, 2014 10:55 pm

Re: Licz Kolory

Postprzez Jan_J » N lis 16, 2014 11:40 pm

JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3989
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Licz Kolory

Postprzez Kotek » Pn lis 17, 2014 3:20 pm

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)?
Dziękuję i pozdrawiam.
OpenOffice 3.1
Kotek
 
Posty: 14
Dołączył(a): Cz paź 02, 2014 10:55 pm

Re: Licz Kolory

Postprzez Jan_J » Wt lis 18, 2014 12:33 am

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.
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3989
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław


Powrót do Basic

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość