Formatowanie warunkowe używając makr - nie działa

Użytkowanie arkusza kalkulacyjnego
Emilime
Posty: 6
Rejestracja: pn gru 05, 2022 8:51 pm

Formatowanie warunkowe używając makr - nie działa

Post autor: Emilime »

Witam,

Jestem tu nowy więc witam wszystkich. Z programem calc mam doświadczenie od wielu lat, liznąłem też trochę programowania w pythonie, C, C#, natomiast problem makr i BASICa z Office mnie rozłożył na łopatki. Próbowałem wszystkiego i na nic, szukałem w internecie, na forach polskich, angielskich a nawet hiszpańskich i nic nie działa.

Otóż problem jest taki, że Calc w ogóle nie nagrywa makra formatowania warunkowego. Wszystko co do tej pory robiłem nagrywał bez problemu, natomiast tu wywala tylko coś takiego:

Kod: Zaznacz cały

rem dispatcher.executeDispatch(document, ".uno:ConditionalFormatDialog", "", 0, Array())
(program nawet sam "komentuje" to tak jakby wiedział że ta instrukcja jest zbędna, mimo to produkuje ją, a poza nią nic.)

To jeszcze nic, oczywiście zdaje się to być ograniczeniem samego programu Calc, który nie potrafi nagrać jakie pola w okienku formatowania warunkowego zaznaczam i wypełniam, tak więc zabrałem się za próby napisania czegoś w BASICu, bo wyglądało to mało skomplikowanie, natomiast poległem z kretesem i nic co udało mi się wyczytać, że działa innym ludziom, u mnie nie zadziałało. Zawsze wywala jakiś błąd składni, jakąś nieznaną metodę czy inne dziwne komunikaty, mimo iż wszystko wygląda mi na poprawne.

Kod, który podobno działa, znaleziony na Hiszpańskim forum, wygląda tak:

Kod: Zaznacz cały

sub formatowanie_warunkowe
Dim Doc, hoja, celda as Object
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
rem dispatcher.executeDispatch(document, ".uno:ConditionalFormatDialog", "", 0, Array())

Dim Conditions(2) as New com.sun.star.beans.PropertyValue

Doc = ThisComponent
hoja = Doc.Sheets.getByName("Zamów tutaj")
celda = hoja.getCellRangeByName("E2:E5216") 
Form = celda.ConditionalFormat
Conditions(0).Name = "Operator"
Conditions(0).Value = com.sun.star.sheet.ConditionOperator.EQUAL
Conditions(1).Name = "Formula1"
Conditions(1).Value = "ZAMÓW"
Conditions(2).Name = "StyleName"
Conditions(2).Value = "Zły"
Form.addNew(Conditions) 

Conditions(0).Name = "Operator"
Conditions(0).Value = com.sun.star.sheet.ConditionOperator.EQUAL
Conditions(1).Name = "Formula1"
Conditions(1).Value = "NA STANIE"
Conditions(2).Name = "StyleName"
Conditions(2).Value = "Dobry"
Form.addNew(Conditions)

celda.ConditionalFormat = Form

end sub
Natomiast mi wyrzuca to błąd "Nie znaleziono właściwości lub metody: addNew."

Próbowałem też innych kodów, nic nie działa, zawsze wywala, że BASIC czegoś nie rozumie, nawet jak kopiuję kod 1:1 z miejsca gdzie ludzie piszą, że działa. Zależy mi, aby zrobić makro, które zaznacza odpowiedni zakres komórek zaczynając od wyznaczonej komórki (ctrl+dół, prawo, ctrl+shift+góra) oraz zastosował formatowanie warunkowe, że jeżeli komórka zawiera "słowo1" zastosuj styl "Zły", jeżeli zawiera "słowo2", zastosuj styl "Dobry".
OpenOffice 3.1 Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Jan_J »

Przykład działa i ustawia formatowanie watunkowe na bloku w kolumnie E, tak jak to opisano. Sprawdziłem w LibreOffice 7.2.6.

Instrukcje

Kod: Zaznacz cały

Doc = ThisComponent
hoja = Doc.Sheets.getByName("Zamów tutaj")
do pomyślnego wykonania wymagają, by bieżący dokument był skoroszytem i posiadał arkusz o nazwie 'Zamów tutaj' (bez cudzysłowów).

Co do niespodzianek, to
* Basic nie jest szczytem finezji jeśli chodzi o programowanie,
* przykłady na forach są często efektem dorywczych prób, a nie systematycznych projektów,
* skuteczność takich przykładów może zależeć także od skonfigurowania środowiska przez osobę, która z niego korzysta. Tworzenie w pełni przenośnego kodu wymaga pewnej wyobraźni i pewnej wprawy.
Tym niemniej w tym przypadku kod robi swoje.

Czy Twoje próby dotyczą OpenOffice 3.1, jak masz napisane w sygnaturze? czym prędzej aktualizuj, tamto oprogramowanie pochodzi z roku 2011 i jest już mocno przestarzałe. Być może także pod względem interfejsu programisty.

Z tym, że Twoje formatowanie działa w oparciu o analizę wartości, a nie o wynik formuły. Nie widzę powodu, by upierać się przy formule przy tak prostym zadaniu. Pewną pomocą może być możliwość podejrzenia efektu w oknie zarządzania fromatowaniem: Format→Warunkowe→Zarządzanie. Tak w Libre, w menu Apache Calc jest trochę inaczej.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
cwolan
Posty: 54
Rejestracja: pn sty 25, 2021 11:17 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: cwolan »

Jan_J pisze: pn gru 05, 2022 10:18 pm Przykład działa i ustawia formatowanie watunkowe na bloku w kolumnie E, tak jak to opisano. Sprawdziłem w LibreOffice 7.2.6.
Być może czegoś tu do końca nie rozumiem, ale według mnie przykład nie będzie działał, jeśli cel kodu jest jak wyrażony przez autora:
Emilime pisze: pn gru 05, 2022 9:31 pm Zależy mi, aby zrobić makro, które zaznacza odpowiedni zakres komórek zaczynając od wyznaczonej komórki (ctrl+dół, prawo, ctrl+shift+góra) oraz zastosował formatowanie warunkowe, że jeżeli komórka zawiera "słowo1" zastosuj styl "Zły", jeżeli zawiera "słowo2", zastosuj styl "Dobry".
Jeśli styl formatowania ma ulec zmianie, gdy komórka / zakres komórek zawiera ciąg "ZAMÓW" czy "NA STANIE", to w kodzie zamiast

Kod: Zaznacz cały

Conditions(1).Value = "ZAMÓW"
(...)
Conditions(1).Value = "NA STANIE"
powinno być

Kod: Zaznacz cały

Conditions(1).Value = """ZAMÓW"""
(...)
Conditions(1).Value = """NA STANIE"""
Testowałem w OpenOffice 4.1.13 oraz LibreOffice 7.3.7.2
OpenOffice 1.1.5 – 4.1.15
LibreOffice 6.4.7 – 7.6.4
Windows 7,10,11 64-bit
Emilime
Posty: 6
Rejestracja: pn gru 05, 2022 8:51 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Emilime »

Jan_J pisze: pn gru 05, 2022 10:18 pm
Czy Twoje próby dotyczą OpenOffice 3.1,
Nie no, mam najnowszą wersję bo pobierałem niedawno, ale wpisałem taką bo nie pamiętam jak sie nazywa.
Jan_J pisze: pn gru 05, 2022 10:18 pm Z tym, że Twoje formatowanie działa w oparciu o analizę wartości, a nie o wynik formuły. Nie widzę powodu, by upierać się przy formule przy tak prostym zadaniu. Pewną pomocą może być możliwość podejrzenia efektu w oknie zarządzania fromatowaniem: Format→Warunkowe→Zarządzanie. Tak w Libre, w menu Apache Calc jest trochę inaczej.
Nie bardzo rozumiem, macro jest mi potrzebne bo będę to musiał robić setki razy, jakto makro. Czemu w takim razie Tobie działa, a mi wywala błąd z tym .addNew?
OpenOffice 3.1 Windows 10
Emilime
Posty: 6
Rejestracja: pn gru 05, 2022 8:51 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Emilime »

cwolan pisze: wt gru 06, 2022 1:11 pm Jeśli styl formatowania ma ulec zmianie, gdy komórka / zakres komórek zawiera ciąg "ZAMÓW" czy "NA STANIE", to w kodzie zamiast

Kod: Zaznacz cały

Conditions(1).Value = "ZAMÓW"
(...)
Conditions(1).Value = "NA STANIE"
powinno być

Kod: Zaznacz cały

Conditions(1).Value = """ZAMÓW"""
(...)
Conditions(1).Value = """NA STANIE"""
Testowałem w OpenOffice 4.1.13 oraz LibreOffice 7.3.7.2
Nic to nie pomaga, bo w dalszym ciągu program nie odpala przez błąd z .addNew

Chciałbym znaleźć przyczynę, czemu innym to działa tylko mi jednemu nie :crazy:
OpenOffice 3.1 Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Jan_J »

Podeślij pusty (bez poufnych treści) skoroszyt z niedziałającym makrem.

Tu jest coś podobnego na forum EN:
https://forum.openoffice.org/en/forum/v ... hp?t=38922
stare, 2011/2013
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Emilime
Posty: 6
Rejestracja: pn gru 05, 2022 8:51 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Emilime »

Proszę wybaczyć, ale nigdy nie wysyłałem "skoroszytu z makrem"... wystarczy zapisać plik i wysłać, czy trzeba jakoś "załączyć" to makro?
OpenOffice 3.1 Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Jan_J »

Makra mogą być zamieszczane albo wewnątrz dokumentu w osobnych obszarach zwanych modułami, albo w obszarze konfiguracyjnym użytkownika Libre|Open Office.
Wystarczy załączyć dokument, o ile mamy pewność że makro jest umieszczone wewnątrz niego. Da się to sprawdzić np. przez
Narzędzia → Makra → Basic → Zarządzaj
i zobaczyć, gdzie leży kod funkcji. Jeśli w jednym z modułów dokumentu, to OK.
W przeciwnym razie zrób jej kopię w nowo utworzonym module w dokumencie, a przed wysyłką upewnij się, czy nadal nie działa.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Emilime
Posty: 6
Rejestracja: pn gru 05, 2022 8:51 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Emilime »

ok, chyba się udało :)

To z angielskiego forum próbowałem już wcześniej, ale tam też jest to nieszczęsne .addNew
Załączniki
Artykuły zamówienia.ods
(12.15 KiB) Pobrany 56 razy
OpenOffice 3.1 Windows 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Rafkus »

Testowałem to makro u mnie, z poprawką zasugerowaną przez @cwolan i również wszystko działało prawie bez błędu zarówno w LO jak i AOO. Problemem była nazwa zastosowanych stylów - w AOO miały nazwę angielską
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
cwolan
Posty: 54
Rejestracja: pn sty 25, 2021 11:17 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: cwolan »

U mnie tak samo jako opisał kolega Rafkus
OpenOffice 1.1.5 – 4.1.15
LibreOffice 6.4.7 – 7.6.4
Windows 7,10,11 64-bit
Emilime
Posty: 6
Rejestracja: pn gru 05, 2022 8:51 pm

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Emilime »

Eh, po przeczytaniu waszych postów nie mogłem uwierzyć własnym oczom, więc jedyne co się nasunęło na myśl to przeinstalować program i tak też zrobiłem. Zadziałało. Musiał to być jakiś dziwny bug, bo słowo daje że ze 2 miesiące temu instalowałem nowego Office'a. Zgaduje że przy poprzedniej instalacji musiał wystąpić jakiś dziwny błąd i program nie miał połączenia z niektórymi funkcjami czy coś. W każdym razie dziękuję za pomoc bo chyba bym się w życiu nie domyślił, że to może być coś tak trywialnego. Byłem pewien, że robię jakiś błąd, że może nie zaimportowałem do programu jakichś bibliotek, albo mam jakieś złe ustawienia, tak jak to bywa w przypadku Pythona.
OpenOffice 3.1 Windows 10
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Formatowanie warunkowe używając makr - nie działa

Post autor: Jermor »

Przeglądałem się temu problemowi z założeniem, że chcemy wyróżnić kilka komórek w wierszu z danymi, które decydują o formatowaniu warunkowym, np. wiersze w kolumnach od B do E. Tu pojawiło się niespodziewane.
W zwykłym, tradycyjnym formatowaniu po zaznaczeniu obszaru formatowania, i wywołaniu okna dialogowego formatowania warunkowego, napisalibyśmy w okienku "Formuła jest" np. $B8="zamów". Okazuje się, że w makrze musimy potraktować pierwszą komórkę tego obszaru jako $B1.
To pierwszy problem.
Drugi wiąże się z (nieszczęsnym) nazewnictwem funkcji w języku polskim. Gdy bowiem chcielibyśmy do formatowania warunkowego zastosować funkcję, to musimy użyć jej angielskiej, a nie polskiej nazwy. Gdyby formatowanie warunkowe miało zareagować na dowolny zapis słowa "zamów", czyli "ZAMÓW, ZaMÓw, zamów ZAmów", to wykorzystalibyśmy jedną z funkcji, po polsku: LITERY.WIELKIE() albo LITERY.MAŁE(). W makrze użyć musimy funkcji o nazwie UPPER() lub LOWER().
Trzeci problem wynika z tego, że makra do formatowania warunkowego powinniśmy użyć tylko raz, gdyż każde kolejne jego wywołanie dodaje ponownie warunki formatowania rozbudowując niepotrzebnie formułę. Można to zobaczyć w menadżerze formatowania warunkowego ("Format -> Warunkowe -> Zarządzanie"). Czyli przed wykonaniem makra powinna wykonać się procedura anulująca formatowanie warunkowe.
Poniżej załączam makro, które na podstawie tych słów wpisywanych do komórek w kolumnie B ma zakolorować wiersze w zakresie B8:E15, od kolumny B do E.

Kod: Zaznacz cały

Sub SetConditionalStyle
  Dim oRange        'Cell range to use
  Dim oConFormat    'Conditional format object
  Dim oCondition(2) As New com.sun.star.beans.PropertyValue

  oRange = ThisComponent.Sheets(0).getCellRangeByName("B8:e15")
  oConFormat = oRange.ConditionalFormat
  
  oCondition(0).Name = "Operator"
  oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
  oCondition(1).Name = "Formula1"
  oCondition(1).Value = "Lower($B1)=""zamów"""
  oCondition(2).Name = "StyleName"
  oCondition(2).Value = "Zły"
  oConFormat.addNew(oCondition())
   oCondition(0).Name = "Operator"
  oCondition(0).Value = com.sun.star.sheet.ConditionOperator.FORMULA
  oCondition(1).Name = "Formula1"
  oCondition(1).Value = "Lower($B1)=""na stanie"""
  oCondition(2).Name = "StyleName"
  oCondition(2).Value = "Dobry"
  oConFormat.addNew(oCondition())
  oRange.ConditionalFormat = oConFormat
End Sub
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
ODPOWIEDZ