Strona 1 z 1

Informacje o dokumencie

PostNapisane: Cz sty 07, 2021 11:32 pm
przez Jermor
Opis zmodyfikowany 16 stycznia 2021.
Przedstawiam, zmodyfikowaną przy współpracy z kolegą @Rafkus, funkcję napisaną dla arkusza Calc, pozwalającą otrzymać niektóre informacje o dokumencie. Pierwszy argument funkcji, podany jako tekst, decyduje jaka informacja zostanie zwrócona. Drugi argument należy podać, jeśli wynik ma zostać sformatowany wg. wymogów użytkownika, w taki sam sposób, jak to opisano w pomocy do funkcji TEKST(). Funkcję można wkopiować do biblioteki "Standard" w kontenerze "Moje makra" i wywoływać ją w arkuszu kalkulacyjnym.
DOKINFO("TypInfo";"styl")
Argument TypInfo wpisywany bezpośrednio do funkcji musi być ujęty w cudzysłów, można go wpisać dowolnymi literami i jest jednym ze słów:
  • Autoro - funkcja zwraca informację kto jest autorem dokumentu.
  • Utworzony - funkcja zwraca datę i godzinę utworzenia dokumentu.
  • Zmodyfikowany - funkcja zwraca datę i godzinę ostatniej modyfikacji.
  • Autorm - funkcja zwraca informację kto jako ostatni modyfikował dokument.
  • Czas - Funkcja zwraca informację o łącznym czasie pracy na dokumencie
  • Ile - Funkcja zwraca informację ile razy dokument był zapisywany.
Argument styl, jeśli zostanie użyty, musi prezentować format jednego z dopuszczalnych sposobów przedstawiania daty i/lub czasu także wpisany w postaci tekstu.

Przykłady:
=DOKINFO("autoro") zwróci informację o osobie, która utworzyła dokument
=DOKINFO(B2) bez drugiego argumentu, gdy B2 zawiera wpisany ciąg "czas", zwróci łączny czas pracy nad dokumentem w układzie: ilość godzin:ilość minut:ilośc sekund.
=DOKINFO("czas";"[mm]") zwróci, podany w minutach, łączny czas pracy nad dokumentem.
=DOKINFO("utworzony";"dd. mmmm yyyy") zwróci datę utworzenia dokumentu w postaci dzień. (liczba.) miesiąc (słownie) rok(liczba) np. 16. stycznia 2021
Kod: Zaznacz cały   Rozszerz widokZwiń widok
Function DokInfo(optional info, Optional styl)
REM Funkcja zwraca wskazaną przez parametr informację o dokumencie
REM argument "info" musi być tekstem:
REM "AutorO" - podaje kto jest autorem dokumentu.
REM "Utworzony" - data utworzenie dokumentu.
REM "Zmodyfikowany" - data ostatniej modyfikacji.
REM "AutorM" - autor ostatniej modyfikacji.
REM "Ile" - Liczba sesji z dokumentem.
REM "Czas" - łączny czas pracy nad dokumentem
REM argument "styl", jeśli wystąpi, musi być jednym z dopuszczalnych formatów
REM prezentacji daty i/lub czasu podany jako tekst, tak jak w funkcji TEKST()
REM Autorzy: Jermor & Rafkus. Polskie forum Apache OpenOffice i LibreOffice (2021)
Dim oData As Object, oDoc As Object
If isMissing(info) Or isArray(info) Then DokInfo="Zły argument" : Stop
If IsMissing(styl) Then styl="Standard"
On Local Error GoTo niemodyfikowany
oDoc=ThisComponent.DocumentProperties
info=UCase(info)
With oDoc
Select Case info
   Case "AUTORO"
      DokInfo= .Author
   Case "UTWORZONY"
      oData=.CreationDate
      With oData
         DokInfo=Format(DateSerial(.Year,.Month,.Day)+TimeSerial(.hours,.minutes,.seconds),styl)
      End With
   Case "ZMODYFIKOWANY"
      oData=.ModificationDate
      With oData
         DokInfo=Format(DateSerial(.Year,.Month,.Day)+TimeSerial(.hours,.minutes,.seconds),styl)
      End With
   Case "AUTORM"   
      DokInfo=.ModifiedBy
   Case "ILE"
      DokInfo=.EditingCycles
   Case "CZAS"
      DokInfo=Format(.EditingDuration/86400,Iif(styl="Standard","[h]:mm:ss",styl))
   Case Else
      DokInfo="Zły argument"
   End Select
End With
Exit Function
niemodyfikowany:
DokInfo="Dokument nie był modyfikowany"
End Function

Do powyższego kodu uwagi dodatkowe wyjasnienia dodał Jan_J i są one zamieszczone w tym wątku: https://forum.openoffice.org/pl/forum/viewtopic.php?f=9&t=5536&p=23286#p23286

Re: Informacje o dokumencie

PostNapisane: Pt sty 08, 2021 11:43 am
przez Rafkus
Szkoda tylko, że data modyfikacji nie odświeża się automatycznie - aktualizuje się tyko podczas otwierania dokumentu.

Re: Informacje o dokumencie

PostNapisane: Pt sty 08, 2021 2:15 pm
przez Jan_J
Jermor napisał(a):Do powyższego kodu uwagi dodał Jan_J i są one zamieszczone w tym wątku: https://forum.openoffice.org/pl/forum/viewtopic.php?f=9&t=5536&p=23286#p23286
No nie:
uwagi dotyczyły technicznego apektu przechowywania tych informacji w dokumentach o typowych formatach; kod natomiast korzysta z interfejsu programowego (API) dotyczącego zarządzania sesjami OpenOffice.

Re: Informacje o dokumencie

PostNapisane: Pt sty 08, 2021 2:56 pm
przez Jermor
Do @Jan_J, przepraszam za niezręczność, miałem na myśli dodatkowe wyjaśnienia, które rzeczywiście mogą przydać się użytkownikowi. Poprawiłem to zdanie.
Poprawiłem niezauważony błąd w argumencie funkcji Format dotyczącej minut (w dwóch miejscach). Drugi argument tej funkcji powinien być ujęty w cudzysłów.
Do @JedenGość @Rafkus - przeoczyłem, że to ty napisałeś post o tej dacie. Zafiksowałem się na @JedenGość i to jemu pisałem objaśnienie. Data modyfikacji umieszczana jest w dokumencie w momencie jego zapisu. Funkcje przeliczane są na początku, po załadowaniu pliku oraz wtedy gdy w arkuszu nastąpią zmiany zawartości wpływające na te funkcje. Data modyfikacji nie jest zapisana w arkuszu lecz "wyciągana" z wnętrza dokumentu, więc jej zmiana w trakcie zapisu dokumentu, nie wpływa na wynik funkcji. Można jednak uzyskać tę datę podczas sesji, w której kilkukrotnie zapisuje się rezultat pracy, w ten sposób, że utworzy się formułę:
=DOKINFO("zmodyfikowany")&T(LOS()) [poprawiłem (po uwadze @Rafkus, poniżej) ponieważ wynikiem tej funkcji jest tekst , dla wyników liczbowych formułę należy uzupełnić o +0*LOS()].
LOS() wyznacza liczbę losową przy każdym przeliczaniu arkusza. Funkcja T(argument) zwraca pusty ciąg znakowy wtedy, gdy argument jest liczbą. Ponieważ LOS wyznacza liczbę zawsze i jest częścią formuły, to wymusza także w tej formule wyznaczenia wyniku funkcji DOKINFO, jeśli dokument został w między czasie zapisany, to pojawi się nowa wartość. Wartość ta pojawi się po pierwszej modyfikacji komórki i nie będzie się zmieniała podczas wprowadzania następnych zmian dopóty, dopóki dokument nie zostanie ponownie zapisany. Jest to o tyle logiczne, że po zapisie można wprowadzić i 10 000 zmian, a następnie zamknąć dokument bez zapisywania, co oznacza zaniechanie wszystkich wprowadzonych modyfikacji.

Re: Informacje o dokumencie

PostNapisane: Pt sty 08, 2021 3:11 pm
przez Rafkus
=DOKINFO("zmodyfikowany")+T(LOS())

Ten sposób zadziałał, gdy zamiast + użyłem znaku &. Dziękuję, przydatna sztuczka.

Re: Informacje o dokumencie

PostNapisane: Pt sty 08, 2021 4:01 pm
przez Jermor
No przecież! "&" dla ciągów tekstowych. Dla wyników liczbowych: "+ 0*LOS()"

Re: Informacje o dokumencie

PostNapisane: Wt sty 19, 2021 5:01 pm
przez Rafkus
Pozwoliłem sobie zamienić ze sobą położenie dwóch linijek kodu, oto one:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
On Local Error GoTo niemodyfikowany
oDoc=ThisComponent.DocumentProperties

Podczas testowania tej funkcji odkryliśmy, że jeżeli funkcja ta zostanie zapisana w głównym kontenerze makr (czyli w "Moich makrach") to podczas uruchamiania danego pliku powstaje jakiś błąd. Wydaje mi się, że funkcja ta zostaje po prostu wywołana za wcześnie, tj. w chwili gdy dokument nie jest jeszcze w pełni załadowany i nie wiadomo co jest "tym komponentem". Po zmianie w kodzie, zamiast wykrzaczeniu się komunikatów o błędzie, do komórki (-ek) zostanie wpisany tekst "Dokument nie był modyfikowany". I teraz znam dwa sposoby na wymuszenie pojawienia się poprawnych wartości:
    1. Jeżeli w jakiś komórkach zostały dokonane jakieś zmiany to zapisać dokument, a następnie z menu Plik wybrać Załaduj ponownie.
    2. Wykorzystać sztuczkę zaproponowaną wcześniej przez @Jermora:
    Można jednak uzyskać tę datę podczas sesji, w której kilkukrotnie zapisuje się rezultat pracy, w ten sposób, że utworzy się formułę:
    =DOKINFO("zmodyfikowany")&T(LOS()) [poprawiłem (po uwadze @Rafkus, poniżej) ponieważ wynikiem tej funkcji jest tekst , dla wyników liczbowych formułę należy uzupełnić o +0*LOS()].
    LOS() wyznacza liczbę losową przy każdym przeliczaniu arkusza. Funkcja T(argument) zwraca pusty ciąg znakowy wtedy, gdy argument jest liczbą. Ponieważ LOS wyznacza liczbę zawsze i jest częścią formuły, to wymusza także w tej formule wyznaczenia wyniku funkcji DOKINFO, jeśli dokument został w między czasie zapisany, to pojawi się nowa wartość. Wartość ta pojawi się po pierwszej modyfikacji komórki i nie będzie się zmieniała podczas wprowadzania następnych zmian dopóty, dopóki dokument nie zostanie ponownie zapisany.

PS. Opisany błąd nie pojawiał się jeżeli ta funkcja została zapisana w pliku.

Re: Informacje o dokumencie

PostNapisane: Wt sty 19, 2021 10:11 pm
przez Jermor
Też to zauważyłem i zamieniłem kolejność.
Co do używania funkcji LOS(). W tej wersji funkcji daty są liczbami (sformatowanymi jak data i czas), zatem należałoby dopisać +0*LOS().
Jednak wówczas wynik zostanie przekształcony znowu na liczbę. Dlatego funkcje można wywołać bez argumentu "styl" a wynikową komórkę należy sformatować na datę.
Moje spostrzeżenia sugerują, że błąd pojawia się wtedy, gdy funkcję wpisuje się do nowego dokumentu, takiego, który nie był jeszcze zapisany. Wtedy obiekt ModificationDate ma wartość NULL, czyli nie został jeszcze zainicjowany. Dlatego pojawia się błąd Basica.
Ale zauważyłem więcej dziwnych zachowań. Chyba napiszę w tej sprawie do bugzilli.

Re: Informacje o dokumencie

PostNapisane: Pn kwi 12, 2021 4:21 pm
przez AlaKowalczyk
Dzięki wielkie, bardzo użyteczna funkcja ;)