Licz Kolory

Makropolecenia i funkcje w języku Basic
jacako
Posty: 4
Rejestracja: śr maja 15, 2013 2:21 pm

Licz Kolory

Post 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
WIN 7 64 Bit, LibreOffice 4.0.3.3
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Licz Kolory

Post 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).
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
jacako
Posty: 4
Rejestracja: śr maja 15, 2013 2:21 pm

Re: Licz Kolory

Post 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
WIN 7 64 Bit, LibreOffice 4.0.3.3
Minio
Posty: 323
Rejestracja: śr sie 01, 2012 1:48 am
Lokalizacja: (Poznań|Dziwnów), Polska

Re: Licz Kolory

Post 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.
Mój blog o używaniu LibreOffice
LibreOffice 4.2.6, Debian testing amd64
jacako
Posty: 4
Rejestracja: śr maja 15, 2013 2:21 pm

Re: Licz Kolory

Post 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
WIN 7 64 Bit, LibreOffice 4.0.3.3
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Licz Kolory

Post 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.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
jacako
Posty: 4
Rejestracja: śr maja 15, 2013 2:21 pm

Re: Licz Kolory

Post autor: jacako »

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

Pozdrawiam Jaca
WIN 7 64 Bit, LibreOffice 4.0.3.3
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Licz Kolory

Post 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ż.
Załączniki
suma_wg_koloru_komórki.ods
(49.24 KiB) Pobrany 3205 razy
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Kotek
Posty: 14
Rejestracja: czw paź 02, 2014 10:55 pm

Re: Licz Kolory

Post 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?
Dziękuję i pozdrawiam.
OpenOffice 3.1
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Licz Kolory

Post autor: Jan_J »

JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Kotek
Posty: 14
Rejestracja: czw paź 02, 2014 10:55 pm

Re: Licz Kolory

Post 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)?
Dziękuję i pozdrawiam.
OpenOffice 3.1
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Licz Kolory

Post 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.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ