Licz Kolory
Licz Kolory
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
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
Re: Licz Kolory
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)
Drugie działa na pełnym prostokątnym zakresie (więc wolniej), i nie działa kiedy zakres jest złożony
Każdą z tych funkcji możesz wywołać z procedury (makra) np. takCzego 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).
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
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
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
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|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Licz Kolory
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
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
Re: Licz Kolory
Wpisane wartości są pokolorowane czy komórki (ich tło) są pokolorowane?jacako pisze:Dla wyjaśnienia podam, że formuła jest potrzebna do zliczania wartości wpisanych do komórek, które są odpowiednio pokolorowane
Ujmę to, co chciał przekazać Jan_J, dobitniej: dlaczego te komórki w ogóle są pokolorowane?jacako pisze:i z całego arkusza ma wykonać operację sumowania w zależności od koloru komórki.
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
LibreOffice 4.2.6, Debian testing amd64
Re: Licz Kolory
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
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
Re: Licz Kolory
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.
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|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Licz Kolory
Witam,
i dziękuję za poświęcony mi czas.
Pozdrawiam Jaca
i dziękuję za poświęcony mi czas.
Pozdrawiam Jaca
WIN 7 64 Bit, LibreOffice 4.0.3.3
Re: Licz Kolory
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ż.
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 3229 razy
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Licz Kolory
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
OpenOffice 3.1
Re: Licz Kolory
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Licz Kolory
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
OpenOffice 3.1
Re: Licz Kolory
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.
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|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)