[Solved]poprawnośc danych-makro-akceptuj lub anuluj wpis
[Solved]poprawnośc danych-makro-akceptuj lub anuluj wpis
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
Re: poprawnośc danych-makro-akceptuj lub anuluj wpis
Spróbuj dostosować to makro
Czy to ci pomoże nie wiem, lub raczej brak czasu na test. Zamiast instrukcji Print wywołaj swoje dzieło
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
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: poprawnośc danych-makro-akceptuj lub anuluj wpis
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]
Powód: Znaczniki [code]
Apache OpenOffice 4.1.5 na Windows 10
Re: poprawnośc danych-makro-akceptuj lub anuluj wpis
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:
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)
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: poprawnośc danych-makro-akceptuj lub anuluj wpis
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
Powód: Dodanie BBCode
Apache OpenOffice 4.1.5 na Windows 10