[Solved]poprawnośc danych-makro-akceptuj lub anuluj wpis

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
babiniec4
Posty: 53
Rejestracja: wt sie 03, 2010 10:20 pm

[Solved]poprawnośc danych-makro-akceptuj lub anuluj wpis

Post autor: babiniec4 »

Witam. Szukam możliwości anulowania wpisu w komórce calca jeśli nie spełnia on kryterium...czyli coś jak poprawność danych ale w odniesieniu do tekstu. A bardziej szczegółowo... w komórce wpisuję sobie zdanie. Formuła sprawdza czy w tekście jest wyraz np "pamiątka" i jeśli tak jest nic się nie dzieje a jeśli tego wyrazu brak to wpis jest anulowany. Oczywiście w poprawności danych nie doszukałem się takiej możliwości więc próbowałem poprzez makro "kasowania" przypisane do tej komórki. Niestety makro nie jest w stanie usunąć zawartości komórki z której jest wywołane. Proszę o pomoc w rozwiązaniu tego problemu może innym sposobem lub doskonalszym makrem.
Ostatnio zmieniony ndz sty 29, 2012 12:54 pm przez babiniec4, łącznie zmieniany 3 razy.
Apache OpenOffice 4.1.5 na Windows 10
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: poprawnośc danych-makro-akceptuj lub anuluj wpis

Post autor: belstar »

Spróbuj dostosować to makro

Kod: Zaznacz cały

'włączenie nasłuchu
Sub EventListenerOn 
   oSheet = ThisComponent.CurrentController.getActiveSheet 
   'poniżej określ zakres komórek
   oGroup=oSheet.getCellRangeByName("A1:B5") 
   oListener = createUnoListener("OOO_","com.sun.star.chart.XChartDataChangeEventListener") 
   oGroup.addChartDataChangeEventListener(oListener) 
End Sub 
'wyłączenie nasłuchu
Sub EventListenerOff
	oSheet = ThisComponent.CurrentController.getActiveSheet 
	oGroup=oSheet.getCellRangeByName("A1:B5") ' to samo co wyżej
	oListener = createUnoListener("OOO_","com.sun.star.chart.XChartDataChangeEventListener") 
	oGroup.removeChartDataChangeEventListener(oListener) 
	
End Sub  

Sub OOO_chartDataChanged 
   print("OK it works") 
End Sub 
Czy to ci pomoże nie wiem, lub raczej brak czasu na test. Zamiast instrukcji Print wywołaj swoje dzieło
LibreOffice 5.1.2.2 Ubuntu 16 LTS
babiniec4
Posty: 53
Rejestracja: wt sie 03, 2010 10:20 pm

Re: poprawnośc danych-makro-akceptuj lub anuluj wpis

Post autor: babiniec4 »

Tak mi działa ale msgbox ukazuje się ciągle 2 razy...

Kod: Zaznacz cały

sub Validuj()

'włączenie nasłuchu
 oSheet=ThisComponent.CurrentController.getActiveSheet
 oCell=oSheet.getCellRangeByName("C3")
 oListener=createUnoListener("OOO_","com.sun.star.chart.XChartDataChangeEventListener")
 oCell.addChartDataChangeEventListener(oListener)
end sub 


sub OOO_chartDataChanged()

 oSheet=ThisComponent.CurrentController.getActiveSheet
 oCell=oSheet.getCellRangeByName("B42")
 v=oCell.getValue()

if v=0 then
 oCell=oSheet.getCellRangeByName("C3")
 oCell.clearContents(com.sun.star.sheet.CellFlags.STRING)
 oCell.clearContents(com.sun.star.sheet.CellFlags.VALUE)

msgbox("Fraza błędna")

else
end if
end sub
Ostatnio zmieniony sob sty 28, 2012 11:01 pm przez Jan_J, łącznie zmieniany 1 raz.
Powód: Znaczniki [code]
Apache OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4579
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: poprawnośc danych-makro-akceptuj lub anuluj wpis

Post autor: Jan_J »

Tak, dwa razy. Bo listener działa na C3, wyglądając zmian. A zmian mamy dwa rodzaje:
pierwszy, kiedy użytkownik zmienia stan komórki; drugi, kiedy obsługa wywołana przez listener ją opróżnia.
Musisz rozróżnić te dwie sytuacje, by uniknąć zagnieżdżonego wywoływania obsługi. Np. tak:

Kod: Zaznacz cały

global poziom
sub OOO_chartDataChanged()
    if poziom = 0 then
      poziom = 1
      oSheet=ThisComponent.CurrentController.getActiveSheet
      oCell=oSheet.getCellRangeByName("B42")
      v=oCell.getValue()
      if v=0 then
         oCell=oSheet.getCellRangeByName("C3")
         oCell.clearContents(com.sun.star.sheet.CellFlags.STRING)
         oCell.clearContents(com.sun.star.sheet.CellFlags.VALUE)
         msgbox("Fraza błędna")
      end if
      poziom = 0
  end if
end sub
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
babiniec4
Posty: 53
Rejestracja: wt sie 03, 2010 10:20 pm

Re: poprawnośc danych-makro-akceptuj lub anuluj wpis

Post autor: babiniec4 »

Dziękuję Janie za informację. Z tego typu zagadnieniem spotkałem się pierwszy raz a dzięki Waszej pomocy dało się uzyskać zamierzony cel. Twoje wyjaśnienie z przykładem umożliwiło mi poprawne dostosowanie do moich potrzeb. W moim przypadku wygląda to tak:

Kod: Zaznacz cały

global poziom
sub OOO_chartDataChanged()

if poziom = 0 then

 oSheet=ThisComponent.CurrentController.getActiveSheet
 oCell=oSheet.getCellRangeByName("B42")
 v=oCell.getValue()
if v=0 then
 oCell=oSheet.getCellRangeByName("C3")
 oCell.clearContents(com.sun.star.sheet.CellFlags.STRING)
 oCell.clearContents(com.sun.star.sheet.CellFlags.VALUE)
 msgbox("Fraza błędna")
 poziom = 1
end if

else
 poziom = 0

end if
end sub
Ostatnio zmieniony ndz sty 29, 2012 12:56 pm przez quest-88, łącznie zmieniany 1 raz.
Powód: Dodanie BBCode
Apache OpenOffice 4.1.5 na Windows 10
ODPOWIEDZ