Strona 1 z 1
[SOLVED] Funkcja dziś
: pn mar 04, 2013 12:33 am
autor: michal.s
Witam Wszystkich po krótkiej przerwie.
Wałkowałem temat funkcji dziś i poległem

Nie mam pojęcia jak to ugryźć, a mianowicie:
W moim arkuszu zleceń codziennie wpisuję po kilka wierszy.
Za każdym razem i codziennie muszę uzupełniać aktualną datę.
Pomyślałem sobie, że wprowadzę funkcję dziś, skopiuję ją w dół i zapominam o temacie daty

a tu schodek...
Chciałbym uzyskać taki efekt:
A1 to data 03-03-2013 (dziś)
A2 to data 03-03-2013 (dziś)
A3 to jutrzejsza data
(i tutaj pojawia się problem, ponieważ jak jutro otworzę arkusz to wiersz 1 i 2 zmienią się na aktualną datę

)
Czy jest jakiś sposób na to, żeby data z dnia poprzedniego nie zmieniała się na aktualną?
Pozdrawiam Michał
Re: funkcja dziś
: pn mar 04, 2013 8:53 am
autor: Smaigas
Jakoś tak, masz zezwolić iteracje (na rys.)

- Musisz zezwolić iteracje
- Aktualna_data.ods
- Gdy wpiszesz do celi w słupku B coś, w słupku A pojawi się aktualna data
- (8.6 KiB) Pobrany 850 razy
Pozdrawiam
Re: funkcja dziś
: pn mar 04, 2013 11:49 am
autor: michal.s
Smaigas, dokładnie o to mi chodziło.
Dziękuję Bardzo za KONKRETNĄ ODPOWIEDŹ

i za plik który wyjaśnił wszystko
Pozdrawiam Michał
Re: [SOLVED] Funkcja dziś
: pn mar 04, 2013 1:15 pm
autor: Jan_J
Rozumiem, że w ten sposób archwizujesz swoje zlecenia.
Ta metoda nie jest bezpieczna. Cała historia “wisi” w formułach zależnych od faktu, że arkuszowi nie będzie się chciało ich przeliczyć. Ale to ustawienie nie jet związane z plikiem, tylko z pakietem. Kiedy je zmienisz, bo akurat będziesz tak potrzebować, przy okazji możesz stracić ważne dane.
W dokumencie data powinna być stałą. Właściwy byłby formularz proponujący dzisiejszą datę i wstawiający ją do komórki. Sprawdź
http://forum.openoffice.org/pl/forum/vi ... 484&p=6652, choć teraz już chyba podobny gadżet jest w standardowym interfejsie.
Można też pomyśleć o makropoleceniu, które wstawia datę do kolumny A, jeżeli coś wpisujemy do kolumny B, a odpowiednia komórka w A jest pusta.
Re: [SOLVED] Funkcja dziś
: wt mar 05, 2013 1:50 am
autor: michal.s
Dziękuję Janie_J za Twoje rozwiązanie.
Jan_J pisze:Można też pomyśleć o makropoleceniu, które wstawia datę do kolumny A, jeżeli coś wpisujemy do kolumny B, a odpowiednia komórka w A jest pusta.
Temat mnie zaciekawił i gdybym chciał zastosować go w praktyce, jak to miałoby wyglądać?
Pozdrawiam Michał
Re: [SOLVED] Funkcja dziś
: wt mar 05, 2013 6:20 pm
autor: heillos
Jan_J pisze:
Ale to ustawienie nie jet związane z plikiem, tylko z pakietem. Kiedy je zmienisz, bo akurat będziesz tak potrzebować, przy okazji możesz stracić ważne dane.
U mnie ta opcja zapisała się razem z plikiem. Mam LibreOffice 4.0. Wyłączyłem iteracje, a po otworzeniu pliku z włączonymi, opcja się włączyła sama.
Re: [SOLVED] Funkcja dziś
: wt mar 05, 2013 6:46 pm
autor: Jan_J
heillos pisze:U mnie ta opcja zapisała się razem z plikiem. Mam LibreOffice 4.0. Wyłączyłem iteracje, a po otworzeniu pliku z włączonymi, opcja się włączyła sama.
Tym lepiej, ale bez zachwytu. Iteracje są fajne jak chcemy coś rozwiązać metodą kolejnych przybliżeń, ale w sytuacji, kiedy przeliczenie zagraża naszym danym, wolałbym mieć odporniejszą metodę. W takiej postaci przypomina mi to trochę siedzenie na ładunku wybuchowym, który się nie odpala, bo przycisk jest zaklejony plastrem. Lepiej byłoby nie mieć ładunku -- a przynajmniej zdawać sobie sprawę z jego istnienia, żeby później nie mieć do nikogo pretensji..
Lepiej byłoby wpisywać stałe daty do komórki dajmy na to A w chwili, kiedy coś wpisujemy do B.
Tego się nie da zrobić formułą. Makro załączam wraz z arkuszem. Jest to mechanizm znany z API OpenOffice, polegający na zdefiniowaniu obiektu przechwytującego obsługę zdarzenia modyfikacji komórek (w kolumnie B)
Kod: Zaznacz cały
global olistener
Sub removelistener
thiscomponent.sheets(0).getcellrangebyname("B1:B1000").removemodifyListener(olistener)
End Sub
Sub addlistener
ocell=thiscomponent.sheets(0).getcellrangebyname("B1:B1000")
olistener = CreateUnoListener( "MyApp_", "com.sun.star.util.XModifyListener" )
ocell.addmodifylistener(olistener)
End Sub
Sub MyApp_disposing(oEvent)
msgbox "disposing of the listener"
End Sub
Sub MyApp_Modified(oEvent)
x = thisComponent.currentController.getSelection().cellAddress
c = thiscomponent.sheets(0).getcellbyposition(x.Column,x.Row)
if c.getString() <> "" then
c = thiscomponent.sheets(0).getcellbyposition(0,x.Row)
if c.getString() = "" then
c.setValue(date())
c.NumberFormat = 84
endif
endif
End Sub
Jeszcze lepsza byłaby baza danych z polem typu date o domyślnej wartości current_date.
Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 1:03 am
autor: michal.s
Smaigas,
mam pytanie, jak zamieściłeś zrzut w lokalizacji
http://forum.openoffice.org/pl/forum/do ... =view[list][/list]
Chciałbym też zamieścić zrzut ekranu w poście.
Kiedyś używałem jakiś zewnętrznych serwerów, a po co sobie utrudniać
Pozdrawiam Michał
Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 1:11 am
autor: Minio
Gdy piszesz wiadomość, na ekranie znajdują się (od góry do dołu):
- pole treści wiadomości
- przyciski wysyłania (zapisz kopię, podgląd, wyślij)
- opcje (dołącz podpis, powiadom o odpowiedziach itd.). Na prawo od opcji znajduje się zakładka „Dodaj załącznik”.
Dalej już chyba nie muszę tłumaczyć

.
Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 1:17 am
autor: michal.s
Janie_J,
Zastosowałem Twoje rozwiązanie w mojej bazie i wszystko działa bardzo dobrze jeżeli z ręki wprowadzam do kolumny B tekst.
Problem pojawia się w momencie, gdy zaznaczam dwie komórki, przykładowo A1 i A2 i zciągam w dół. Otrzymuję wtedy kolejny numer
A1 13-03-13000
A2 13-03-13001
A3 13-03-13002
Wyskakuje wtedy błąd którego komunikat chciałbym wkleić jako zrzut do postu, ale nie mam wiedzy jak umieścić plik w katalogu
Pozdrawiam Michał
p.s.
Nawiązując do tematu wyżej:
Dlatego tak robię, ponieważ nie mogę sobie poradzić z rosnącymi wartościami przez przeciagnięcie jednej komórki w dól.
Jeżeli tak robię to wtedy odejmuje jeden od komórki wyżej.
Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 3:44 am
autor: b0bi
Wyskakuje wtedy błąd którego komunikat chciałbym wkleić jako zrzut do postu, ale nie mam wiedzy jak umieścić plik w katalogu
Pod oknem, w którym wpisujesz tekst widnieje zakładka "Opcje" i "Dodaj załącznik"
poprzez Przeglądaj wybierasz plik i zatwierdzasz przez naciśnięcie Dodaj plik.
Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 8:50 am
autor: michal.s
b0bi, dziękuję,
Myślałem, że to bardziej skomplikowane

i że trzeba umieścić plik gdzieś na serwerze, a potem wkleić link (tak jak np. w Voila)
Pozdrawiam Michał
Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 8:54 am
autor: michal.s
Minio pisze:Dalej już chyba nie muszę tłumaczyć

.
Minio, dzięki

Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 11:26 am
autor: michal.s
Janie_J,
To jest ten komunikat, który się pojawia po zaznaczeniu np. 420 i 421 wiersza i przeciągnięciu w dół
Pozdrawiam Michał
Re: [SOLVED] Funkcja dziś
: śr mar 06, 2013 5:23 pm
autor: Jan_J
Tak, wiem o tym, tylko nie napisałem.
Problem leży w tym, że obiekt selection ma inną strukturę w przypadku pojedynczej komórki, inną w przypadku bloku. Trzeba to wziąć pod uwagę. A ja nie zrobiłem tego, traktując rozwiązanie raczej jako szkic poglądowy.
Załączam poprawioną wersję, działającą na pojedynczych komórkach, blokach i zestawach bloków:
Kod: Zaznacz cały
global olistener
global column
Sub removelistener()
thiscomponent.sheets(0).getcellrangebyname("B1:B1000").removemodifyListener(olistener)
End Sub
Sub addlistener()
ocell=thiscomponent.sheets(0).getcellrangebyname("B1:B1000")
olistener = CreateUnoListener( "MyApp_", "com.sun.star.util.XModifyListener" )
ocell.addmodifylistener(olistener)
column = 1
End Sub
Sub MyApp_disposing(oEvent)
msgbox "disposing of the listener"
End Sub
sub insertTodayIntoRange(r)
sheet = thisComponent.sheets.getByIndex(r.Sheet)
if r.StartColumn <= column and r.endColumn >= column then
for row = r.StartRow to r.EndRow
c = sheet.getcellbyposition(column,row)
if c.getString() <> "" then
c = sheet.getcellbyposition(0, row)
if c.getString() = "" then
c.setValue(date())
c.NumberFormat = 84
endif
endif
next row
end if
end sub
Sub MyApp_Modified(oEvent)
s = thisComponent.currentController.getSelection()
On Error GoTo ProceedRanges
r = s.RangeAddress
insertTodayIntoRange(r)
exit sub
ProceedRanges:
rr = s.RangeAddresses
for i = lbound(rr) to ubound(rr)
insertTodayIntorange(rr(i))
next i
End Sub
Re: [SOLVED] Funkcja dziś
: czw mar 07, 2013 3:13 pm
autor: Husar
Witam,
istnieje prostsza metoda rozwiązania problemu, bez używania makropoleceń. Jakiś rok temu miałem ten sam problem do zastosowania w Excel'u a ponieważ nie znam za dobrze VBA musiałem to inaczej rozwiązać, dodatkowym motywem znalezienia innego rozwiązania było to, że arkusza używają totalni laicy w kwestiach arkuszy kalkulacyjnych.
Ale do rzeczy. W jakimś arkuszu (najlepiej stworzyć sobie osobny jedynie do tych elementów, w przykładzie arkusz Opcje) tworzymy sobie listę wyboru w podobny sposób jak w załączonym pliku. Jedna opcja to pusta komórka a w drugiej wpisujemy funkcję =dziś(). Zaznaczamy obszar z obiema komórkami (pustą i funkcją dziś()) i nazywamy dowolnie (w załączonym przykładzie nazwałem ją PoleWyboruDaty). Zauważyłem, że w LibreOffice należy ustawić dla komórki z funkcją =dziś() format daty jaki odpowiada naszym potrzebom, bo inaczej po wybraniu w liście data będzie pokazywać się Nam w formacie liczbowym. Następnie w docelowym arkuszu (w przykładzie BazaDanych) dla komórek w kolumnie z datą (kolumna B od B2) wprowadzamy listę wyboru z opcji Dane -> Poprawność danych... w otwierającym się oknie w zakładce Kryteria w Zezwalaj wybieramy Zakres komórek a w polu Źródło wpisujemy nazwę naszej listy (w przykładzie: =PoleWyboruDaty). Kopiujemy komórkę w dół.
Po wyborze z listy daty ta pozostaje w wartości jaka była danego dnia. W kolejnych dniach data w polu wyboru zmienia się ale nie tam gdzie wybraliśmy wcześniej już datę. Rozwiązanie działa już ponad rok.
Pozdrawiam
Re: [SOLVED] Funkcja dziś
: czw mar 07, 2013 11:21 pm
autor: Jan_J
To jest stabilne, bo do komórki dostaje się stałą, a nie formuła. Przy tym eleganckie, bo bez zbędnego kodu. Jedyna niedogodność to fakt, że wpis wymaga aktywności operatora (wybór z listy).
Re: [SOLVED] Funkcja dziś
: pt mar 08, 2013 8:59 am
autor: Husar
Jan_J pisze:Jedyna niedogodność to fakt, że wpis wymaga aktywności operatora (wybór z listy).
Niestety, nie ma rozwiązań idealnych. Zawsze można zmienić na nową datę w pierwszym wierszu a potem przeciągnąć w dół.
Re: [SOLVED] Funkcja dziś
: pn mar 11, 2013 8:35 pm
autor: michal.s
Husar pisze:Jan_J pisze:Jedyna niedogodność to fakt, że wpis wymaga aktywności operatora (wybór z listy).
Niestety, nie ma rozwiązań idealnych. Zawsze można zmienić na nową datę w pierwszym wierszu a potem przeciągnąć w dół.
Panowie, a pomyślałem sobie, że zamiast wybierać datę z listy można ją skopiować z arkusza opcje do arkusz baza danych.
Zastosować opcję o której Janie_J pisałeś w kwestii kalendarza, cytuję
Jest to mechanizm znany z API OpenOffice, polegający na zdefiniowaniu obiektu przechwytującego obsługę zdarzenia modyfikacji komórek (w kolumnie B)
Przypisać działanie np. żeby czynność wykonać w momencie zapisania dokumentu.
I mamy w miejscu daty na stałe wpisany tekst z aktualną datą.
Nieźle to sobie wykombinowałem

tylko jak to zapisać w kodzie ?!

Re: [SOLVED] Funkcja dziś
: pn mar 11, 2013 11:55 pm
autor: Jan_J
Jeżeli chcesz kopiować, to albo ręcznie, albo makropoleceniem. Moja uwaga dotyczyła automatycznego wykonania kopiowania w określonej sytuacji (zmiana zawartości komórki). Poprawiona wersja mojego szkicu jeży w
http://forum.openoffice.org/pl/forum/vi ... 1710#p7292 czyli kilka postów wyżej. Działa na komórkach, na zaznaczonych blokach i na zespołach bloków.