[SOLVED] Funkcja dziś

Użytkowanie arkusza kalkulacyjnego
michal.s
Posty: 86
Rejestracja: pn sty 23, 2012 6:55 pm

[SOLVED] Funkcja dziś

Post 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ł
Pozdrawiam Michał
OpenOffice3.3 na Windows 7
Smaigas
Posty: 135
Rejestracja: czw lut 04, 2010 8:43 am
Lokalizacja: Lietuva (Litwa), Vilnius (Wilno)

Re: funkcja dziś

Post autor: Smaigas »

Jakoś tak, masz zezwolić iteracje (na rys.)
Musisz zezwolić iteracje
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 836 razy
Pozdrawiam
Version: 5.2.5.1 Build ID: 0312e1a284a7d50ca85a365c316c7abbf20a4d22
Windows XP PRO SP3
michal.s
Posty: 86
Rejestracja: pn sty 23, 2012 6:55 pm

Re: funkcja dziś

Post 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ł
Pozdrawiam Michał
OpenOffice3.3 na Windows 7
Jan_J
Posty: 4621
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Funkcja dziś

Post 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.
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
michal.s
Posty: 86
Rejestracja: pn sty 23, 2012 6:55 pm

Re: [SOLVED] Funkcja dziś

Post 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ł
Pozdrawiam Michał
OpenOffice3.3 na Windows 7
Awatar użytkownika
heillos
Posty: 164
Rejestracja: wt cze 02, 2009 8:19 am

Re: [SOLVED] Funkcja dziś

Post 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.
Jan_J
Posty: 4621
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Funkcja dziś

Post 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.
Załączniki
wpisujDaty.ods
(10.02 KiB) Pobrany 431 razy
JJ
LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
michal.s
Posty: 86
Rejestracja: pn sty 23, 2012 6:55 pm

Re: [SOLVED] Funkcja dziś

Post 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ł
    Pozdrawiam Michał
    OpenOffice3.3 na Windows 7
    Minio
    Posty: 323
    Rejestracja: śr sie 01, 2012 1:48 am
    Lokalizacja: (Poznań|Dziwnów), Polska

    Re: [SOLVED] Funkcja dziś

    Post 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ć ;) .
    Mój blog o używaniu LibreOffice
    LibreOffice 4.2.6, Debian testing amd64
    michal.s
    Posty: 86
    Rejestracja: pn sty 23, 2012 6:55 pm

    Re: [SOLVED] Funkcja dziś

    Post 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.
    Pozdrawiam Michał
    OpenOffice3.3 na Windows 7
    b0bi
    Posty: 80
    Rejestracja: wt lut 19, 2013 8:23 pm

    Re: [SOLVED] Funkcja dziś

    Post 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.
    Załączniki
    capture.jpg
    LibreOffice 4.0 na Windows 7 Home Premium
    michal.s
    Posty: 86
    Rejestracja: pn sty 23, 2012 6:55 pm

    Re: [SOLVED] Funkcja dziś

    Post 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ł
    Pozdrawiam Michał
    OpenOffice3.3 na Windows 7
    michal.s
    Posty: 86
    Rejestracja: pn sty 23, 2012 6:55 pm

    Re: [SOLVED] Funkcja dziś

    Post autor: michal.s »

    Minio pisze:Dalej już chyba nie muszę tłumaczyć ;) .
    Minio, dzięki ;-)
    Pozdrawiam Michał
    OpenOffice3.3 na Windows 7
    michal.s
    Posty: 86
    Rejestracja: pn sty 23, 2012 6:55 pm

    Re: [SOLVED] Funkcja dziś

    Post 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ł
    Załączniki
    Przechwytywanie.PNG
    Pozdrawiam Michał
    OpenOffice3.3 na Windows 7
    Jan_J
    Posty: 4621
    Rejestracja: pt maja 22, 2009 1:20 pm
    Lokalizacja: Wrocław

    Re: [SOLVED] Funkcja dziś

    Post 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
    
    Załączniki
    wpisujDaty.ods
    (10.22 KiB) Pobrany 357 razy
    JJ
    LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
    Husar
    Posty: 203
    Rejestracja: śr mar 06, 2013 3:48 am

    Re: [SOLVED] Funkcja dziś

    Post 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
    Załączniki
    funkcja dziś.ods
    (9.35 KiB) Pobrany 476 razy
    Pozdrawiam
    Roman

    Daj znać [SOLVED], kiedy Twój problem zostanie rozwiązany
    LO 7.2.x/AOO 4.1.x. używane na Ubuntu 20.04LTS i M$ Windows 10
    Jan_J
    Posty: 4621
    Rejestracja: pt maja 22, 2009 1:20 pm
    Lokalizacja: Wrocław

    Re: [SOLVED] Funkcja dziś

    Post 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).
    JJ
    LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
    Husar
    Posty: 203
    Rejestracja: śr mar 06, 2013 3:48 am

    Re: [SOLVED] Funkcja dziś

    Post 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ół.
    Pozdrawiam
    Roman

    Daj znać [SOLVED], kiedy Twój problem zostanie rozwiązany
    LO 7.2.x/AOO 4.1.x. używane na Ubuntu 20.04LTS i M$ Windows 10
    michal.s
    Posty: 86
    Rejestracja: pn sty 23, 2012 6:55 pm

    Re: [SOLVED] Funkcja dziś

    Post 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 ?! :-(
    Pozdrawiam Michał
    OpenOffice3.3 na Windows 7
    Jan_J
    Posty: 4621
    Rejestracja: pt maja 22, 2009 1:20 pm
    Lokalizacja: Wrocław

    Re: [SOLVED] Funkcja dziś

    Post 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.
    JJ
    LO (25.2|24.8) ∙ Python (3.12|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
    ODPOWIEDZ