Strona 1 z 1

Kalendarz - wybór daty do wpisania do komórki

: śr paź 10, 2012 9:09 am
autor: Andrzej.K
Witam,
Miałem (w zasadzie mam nadal) piękny dodatek (załączam go) Kalendarz, który przez wiele lat służył mi pod MS OFFICE.
Uwarunkowania spowodowały, że muszę się przesiąść na OO i czuję wyraźną lukę, pustkę.

Szukałem na tym forum i w necie podobnych dodatków ale nic nie znalazłem, są kalendarze ale 100% to formatki (terminarze itp).

Zdecydowałem się napisać aby dowiedzieć się wśród specjalistów czy może ktoś widział taki dodatek jak mój ale pod OO.
Ewentualnie może ktoś potrafi "przekonwertować" ten kalendarz z MS na OO?

Nie chcę być nieskromny ale gdy znalazłem ten mój kalendarz pod MS i pokazałem go w firmie to był szał. Okazało się, że 90% osób było w podobnej sytuacji jak ja - klepało daty z palca i irytowało ich to maksymalnie.

Fajnie jakby się udało coś z moim problemem zrobić

Pozdrawiam
Andrzej

Re: Kalendarz - wybór daty do wpisania do komórki

: śr paź 10, 2012 9:39 am
autor: Jan_J
Witaj na forum,

nie zdołałem jeszcze obejrzeć Twojego dodatku w akcji. Zrobię to przy najbliższej okazji dostępu do Excela. Przeglądanie kodu pod LO nie daje pełnej orientacji.

W OO/LO istnieje wizualny komponent wyboru daty. Odpowiedni element API jest zarejestrowany pod nazwą com.sun.star.form.component.DateField, patrz http://www.openoffice.org/api/docs/comm ... Field.html. Można go wbudowywać w formularze dialogowe. Rozumiem, że o to by chodziło, i o sensowne sprzęgnięcie tego dialogu z bieżącą komórką.

Re: Kalendarz - wybór daty do wpisania do komórki

: śr paź 10, 2012 9:52 am
autor: quest-88
Czy ten plik na pewno jest poprawny? Poprosiłem kolegę, który ma betę MS Office 2013, aby wyeksportował go do ODS (Office 2013 obsługuje normę zapisu ISO ODF 1.2) i przy próbie otwarcia dokumentu wyskoczył błąd:

Kod: Zaznacz cały

[Window Title]
C:\jckalendarz.xlam

[Content]
Wystąpiły problemy z przesłaniem polecenia do programu.

[OK]
Potem sugeruje konwersje z XLA do XLAM, co nic nie zmienia. XLAM również wypluwa taki błąd.

Re: Kalendarz - wybór daty do wpisania do komórki

: śr paź 10, 2012 10:02 am
autor: Andrzej.K
@jan: sorka ale jestem totalnie lamerski w temacie OO i nie jakiś super w temacie VBA. cała moja praca w excel to raczej formuły itp. Więc nie wiem w ogóle jak miałbym zrobić to co piszesz.
Nie mogę wkleić obrazka ale mój kalendarz działał tak, że siedział sobie na pasku na górze. Stawałeś na komórce, klikałeś na niego i wyskakiwał applet z kalendarzem. wybierałeś datę mychą i kopiowała ci się do komórki a applet kalendarza znikał.

Co do pliku to ten, który załączyłem nazywał się jckalendarz.xla (taki zipowałem) - nie wiem skąd się wzięło to m na końcu.
ten xla bez problemu chodzi bo na stanowisku obok ma go zainstalowany mój kolega (MS office 2003)

Re: Kalendarz - wybór daty do wpisania do komórki

: śr paź 10, 2012 3:45 pm
autor: Jan_J
Poniższy kod definiuje makro InsertDate(), które pozwala wstawić do bieżącej komórki datę wybraną za pomocą kalendarza. Jeżeli w komórce była już jakaś data (albo liczba), to jest ona wstępnie proponowana w dialogu.

Pozostają sprawy ergonomii (zatwierdzić zmianę dwuklikiem w polu kalendarza?) i oprawy (skrót klawiszowy?, wpis w menu?, dodatek?).

Kod: Zaznacz cały

rem global todo: oprawa w skrót klawiszowy albo menu

rem wstawia wybraną datę do bieżącej komórki
rem todo: inne typy dokumentów
rem todo: porządne formaty komórki/pola z datą zamiast magicznych liczb
rem todo: przypadek, kiedy selection jest blokiem
rem todo: kod braku wartości (0 jest legalną wartością daty)
rem
Sub InsertDate()
  doc = thisComponent
  ctr = doc.currentController
  cell = ctr.getSelection()
  aDate = DateSelection(cell.getValue())
  if aDate <> 0 then
    cell.setValue(aDate)
    cell.NumberFormat = 84 ' yyyy-mm-dd date
  end if
End Sub

rem wywołuje dialog wyboru daty; wybrana wartość zwracana jako wynik
rem w przypadku rezygnacji zwraca wartość 0
rem
function DateSelection(aDate) as Variant
  dlg = createUnoService("com.sun.star.awt.UnoControlDialogModel")
  dlg.PositionX = 50
  dlg.PositionY = 50
  dlg.Width = 150
  dlg.Height = 30
  dlg.Title = "Wybór daty"
  
  dc = createUnoService( "com.sun.star.awt.UnoControlDialog" )
  dc.setModel(dlg) 

  field = dlg.createInstance("com.sun.star.form.component.DateField")
  field.DateFormat = 11 rem "yyyy-mm-dd"
  field.DropDown = True
  rem w razie potrzeby: zmiana zakresu obsługiwanych dat -- format ISO
  rem field.DateMin = 16000101
  rem field.DateMax = 30001231
  dlg.insertByName("CalendarField", field)
  fc = dc.getControl("CalendarField")
  fc.setPosSize(10, 10, 200, 30, com.sun.star.awt.PosSize.POSSIZE)

  if aDate = 0 then
    aDate = now() 
  end if
  fc.Date = cDateToISO(aDate)
  fc.setFocus()

  button = dlg.createInstance( "com.sun.star.awt.UnoControlButtonModel" )
  button.PushButtonType = com.sun.star.awt.PushButtonType.OK
  dlg.insertByName("OKButton", button)
  button.Label = "OK"
  bc = dc.getControl("OKButton")
  bc.setPosSize(210, 10, 50, 30, com.sun.star.awt.PosSize.POSSIZE)

  button = dlg.createInstance( "com.sun.star.awt.UnoControlButtonModel" )
  button.PushButtonType = com.sun.star.awt.PushButtonType.CANCEL
  dlg.insertByName("CancelButton", button)
  button.Label = "Anuluj"
  bc = dc.getControl("CancelButton")
  bc.setPosSize(260, 10, 50, 30, com.sun.star.awt.PosSize.POSSIZE)   
 
  dc.setVisible(True)
  result = dc.Execute()
  if result = 1 then
    DateSelection = cDateFromISO(fc.Date)
  else
    DateSelection = 0
  end if 
End Function
Instalacja: Narzędzia→Makra→Zarządzaj→Basic→Moje makra→Nowy→Wklej kod

Re: Kalendarz - wybór daty do wpisania do komórki

: śr paź 10, 2012 4:09 pm
autor: Andrzej.K
Chętnie bym to przetestował ale ścieżka poleceń którą podałeś jest u mnie inna (mam OO 3.3.0)
U mnie mam tak: NARZĘDZIA > MAKRA > ZARZĄDZAJ MAKRAMI > i tu muszę wybrać MAKRO albo PYTHON albo BEANSHELL albo JAVASCRIPT.
Ja po zarządzaj wybiorę MAKRO to mam jakieś magiczne okno ale nie mogę nigdzie znaleźć do wklejenia kodu

Re: Kalendarz - wybór daty do wpisania do komórki

: śr paź 10, 2012 4:13 pm
autor: Jan_J
W OpenOffice.org: Narzędzia→Makra→Zarządzaj→Makro→magiczne okno; z lewej > Moje makra; z prawej [Nowy]; w dialogu zatwierdź nazwę [OK] i wklej kod do edytora.
Potem Narzędzia→Makra→Wykonaj + trochę nawigacji, albo przypisz skrót klawiszowy.

Re: Kalendarz - wybór daty do wpisania do komórki

: czw paź 11, 2012 11:14 am
autor: Andrzej.K
No jest to jakieś rozwiązanie do czasu jak komuś się nie uda przerobić tego mojego dodatku.

Dzięki

Re: Kalendarz - wybór daty do wpisania do komórki

: sob paź 13, 2012 2:25 am
autor: Jan_J
Obejrzałem Twój kalendarz i sądzę, że mojego dialogu w zasadzie używa się podobnie.

Właśnie opakowałem go w dodatek, który wstawia nową listwę narzędzi z jednym przyciskiem: [Wstaw datę] oraz wpis w menu Narzędzia→Dodatki→Wstaw datę. Nie proponuje skrótu klawiszowego.

Testowany w LO 3.6 i w OOo 3.3. Public domain, zero zastrzeżeń, zero gwarancji. Ale jak trzeba, to odpowiem.

Re: Kalendarz - wybór daty do wpisania do komórki

: wt paź 16, 2012 12:00 pm
autor: Andrzej.K
Możesz podać ścieżkę jak go dodać bo mnie cały czas wyrzuca "z powodu nieznanego błędu program OO został niespodziewanie zamknięty. Wszystkie pliki zostały zachowane"

Re: Kalendarz - wybór daty do wpisania do komórki

: wt paź 16, 2012 6:04 pm
autor: Jan_J
Rozpakuj oxt-a z zipa (tak, wiem, jest to podwójnie zzipowane). Następnie w OOo albo w LO, jaku zwykły user: Narzędzia → Menedżer rozszerzeń → Dodaj. Po następnym uruchomieniu winna być widoczna nowa listwa z przyciskiem.

PS. Testowałem dodatek na OOo 3.3 (Linux. Windows 7) oraz LibreOffice 3.5 i 3.6 (Linux, Windows 7). Nie wiem, czy jest zgodny z OOo 3.1. Formalnie wpisałem wymaganie wersji OO >= 3.0.

Re: Kalendarz - wybór daty do wpisania do komórki

: czw gru 27, 2012 1:11 pm
autor: bolej1
Witam udalo sie moze komus dopisac ten dodatek z po ktorym wyskoczy okienko z kalendarzem? (op dwukrotnym kliknieciu w komorke) Bardzo bym bym wdzieczny.

Re: Kalendarz - wybór daty do wpisania do komórki

: sob paź 31, 2015 11:30 am
autor: Jan_J
Po 3 latach, modyfikacja z naniesieniem zmian API w LibreOffice.
W Apache OO może nie działać, w razie problemów proszę napisać post.

Re: Kalendarz - wybór daty do wpisania do komórki

: ndz lis 08, 2015 5:05 pm
autor: Astur
Żeby było ślicznie, należy po zainstalowaniu rozszerzenia, zrobić co następuje:
  1. Otworzyć nowy arkusz kalkulacyjny
  2. Kliknąć prawym klawiszem myszki na któryś z pasków narzędzi, np. górny i wybrać Dostosuj pasek narzędzi...
  3. W otwartym okienku Dostosuj, w zakładce Paski narzędzi, na liście Polecenia sekcji Zawartość paska narzędzi odnaleźć, dajmy na to, pozycję Wykres i kliknąć ją.
  4. Następnie kliknąć Dodaj...
  5. W otwartym okienku Dodaj, na liście Kategoria odnaleźć Makra LibreOffice i rozwinąć ją aż do Moje makra/CalendarDlg/Module1
  6. Na liście Polecenia wskazać InsertDate i kliknąć Dodaj, a potem Zamknij.
  7. Ponieważ przycisk w postaci klawisza z napisem "InsertDate" wygląda średnio, warto zmienić jego wystrój. W tym celu należy kliknąć Modyfikuj... a z otwartej listy wybrać Zmień nazwę. W polu Nowa nazwa wpisać, np., "Wstaw datę". Następnie kliknąć OK.
  8. Teraz ponownie kliknąć Modyfkuj... i z otwartej listy wybrać Zmień ikonę.
  9. W okienku odnaleźć jakąś stosowną ikonę, np. .uno:AddDateField i kliknąć ją. Następnie kliknąć OK
  10. Zatwierdzić wszystkie zmiany klikając na OK w okienku Dostosuj.
Teraz we wskazanym miejscu (tu: w okolicy wstawiania wykresu) pojawi się nowy przycisk z wybraną ikonką. Po wskazaniu go myszką pojawi się podpowiedź "Wstaw datę", a po kliknięciu, otworzy się stosowne okienko.

No i jeszcze jeden kosmetyczny zabieg. Należy Otworzyć Menu->Widok->Paski narzędzi i usunąć zaznaczenie przy pozycji Dodatek 1.

Re: Kalendarz - wybór daty do wpisania do komórki

: wt lut 02, 2016 6:15 pm
autor: kturendyk
Witam ja korzystam z takiego kalendarza jak w załączonym przykładzie.W razie pytań pisać.

Re: Kalendarz - wybór daty do wpisania do komórki

: ndz sie 11, 2019 7:09 pm
autor: urden
Jan_J pisze:Po 3 latach, modyfikacja z naniesieniem zmian API w LibreOffice.
W Apache OO może nie działać, w razie problemów proszę napisać post.
Witam serdecznie.
Dziękuję za skrypt - działa doskonale. Mam jednak problem - jak zmienić format daty? Skrypt wymusza datę YYYY-MM-DD. Ja w arkuszu potrzebuję formatu odwrotnego. Teraz wymuszam go na piechotę formatując komórkę po użyciu skryptu, ale to jest bez sensu, bo zajmuje więcej czasu niż wpisanie poprawnej daty z palca.
Pozdrawiam

Re: Kalendarz - wybór daty do wpisania do komórki

: ndz sie 11, 2019 9:05 pm
autor: Jan_J
W kodzie procedury Basica atrybut komórki nazwany NumberFormat jest na sztywno ustawiony na wartość 84.
Różne standardowe formaty dat różnią się wartością tego atrybutu; patrz
https://www.openoffice.org/api/docs/com ... mberFormat
https://wiki.openoffice.org/wiki/Docume ... er_Formats
https://api.libreoffice.org/docs/idl/re ... ormat.html
a w postaci mniej formalnej także
https://ask.libreoffice.org/en/question ... berformat/

Formaty niestandardowe mogą mieć przydzieloną wartość w wyniku zarejestrowania, co w każdym przypadku może dać inną wartość.

Re: Kalendarz - wybór daty do wpisania do komórki

: pn sie 19, 2019 11:21 pm
autor: Rafkus
Troszkę pobawiłem kodem @Jan_J, i przy pomocy makr Andrew Pitonyak dokonałem pewnych (mam nadzieję) ulepszeń.
Najważniejsze to dodałem pole kombi z listą dostępnych formatów dat, można również dodawać nowe. Ponadto dodałem możliwość wstawienia daty do zaznaczonego zakresu komórek :

Kod: Zaznacz cały

rem written by Jan_J, Wrocław, October 2012
rem and Rafkus sierpień 2019
rem this file is public domain
rem
rem wstawia wybraną datę do bieżącej komórki w arkuszu
rem todo: inne typy dokumentów
rem todo: porządne formaty komórki/pola z datą zamiast magicznych liczb
rem W miare prosty sposób można wybrać/stworzyć inny format daty
rem todo: obsługuje przypadek, kiedy wybrany jest blok
rem todo: kod braku wartości (0 jest legalną wartością daty)
rem
Dim cc as variant 'pole kombi w oknie dialogowym
Sub InsertDate()
  Dim oCurrentSelection As Variant
  Dim aDate As Double
  Dim sString As String
  Dim formatNum As Long
  Dim komorka, oFormats As Object	
  Dim aLocale as new com.sun.star.lang.Locale  
  
  doc = thisComponent
  oCurrentSelection = doc.getCurrentSelection()
  if doc.supportsService("com.sun.star.sheet.SpreadsheetDocument") then 
    komorka = oCurrentSelection.getCellByPosition(0,0)
    sString = komorka.getString() 
    if sString <> "" then 
      aDate = komorka.getValue()
    else
      aDate = now()
    endif
    formatNum = komorka.NumberFormat
    aDate = DateSelection(aDate, formatNum)	'dialog
    if aDate <> 0 then
'Najpierw sprawdź, czy istnieje format liczb    
      sString = UCase(cc.text)	'muszą być wielkie litery, przy małych jest problem z dodaniem nowego formatu do listy)
      oFormats = doc.getNumberFormats()      
      formatNum = oFormats.queryKey(sString, aLocale, true)
      'MsgBox "Numer formantu wybranej komórki to" & formatNum
'Jeśli format liczb nie istnieje, dodaj go
      If (formatNum = -1) Then
        formatNum = oFormats.addNew(sString, aLocale)
        'MsgBox "Utworzono nowy format o numerze: " & formatNum
      End If
      
      for i=0 to oCurrentSelection.Columns.Count-1
        for j=0 to oCurrentSelection.Rows.Count-1
          komorka = oCurrentSelection.getCellByPosition(i, j)
          komorka.setvalue(aDate)
          komorka.NumberFormat = formatNum  '84 'yyyy-mm-dd date
        next j
      next i           
    end if
 '   print aDate
 '   print sString   
  end if  
End Sub

rem
rem wywołuje dialog wyboru daty; wybrana wartość zwracana jako wynik
rem w przypadku rezygnacji zwraca wartość 0
rem
function DateSelection(aDate,aNumer as long) as Variant

  dlg = createUnoService("com.sun.star.awt.UnoControlDialogModel")
  dlg.PositionX = 50
  dlg.PositionY = 50
  dlg.Width = 150
  dlg.Height = 50
  dlg.Title = "Wybór daty"
  
  dc = createUnoService("com.sun.star.awt.UnoControlDialog")
  dc.setModel(dlg) 

  field = dlg.createInstance("com.sun.star.form.component.DateField")
  field.DateFormat = 11 rem "yyyy-mm-dd"
  field.DropDown = True
  field.spin = True  	'dopisane  
  rem w razie potrzeby: zmiana zakresu obsługiwanych dat -- format ISO, np.
  rem field.DateMin = 16000101
  rem field.DateMax = 30001231  
  
  dlg.insertByName("CalendarField", field)
  fc = dc.getControl("CalendarField")
  fc.setPosSize(10, 10, 200, 30, com.sun.star.awt.PosSize.POSSIZE)

  fc.Date = cDateToISO(aDate)                  'skasować rem jeżeli jest stosowany OpenO.
rem  fc.Date = cDateToUNODate(aDate)     'skasować rem jeżeli jest stosowany LibreO.
  fc.setFocus()
  button = dlg.createInstance("com.sun.star.awt.UnoControlButtonModel")
  button.PushButtonType = com.sun.star.awt.PushButtonType.OK
  dlg.insertByName("OKButton", button)
  button.Label = "OK"
  bc = dc.getControl("OKButton")
  bc.setPosSize(210, 10, 50, 30, com.sun.star.awt.PosSize.POSSIZE)

  button = dlg.createInstance("com.sun.star.awt.UnoControlButtonModel")
  button.PushButtonType = com.sun.star.awt.PushButtonType.CANCEL
  dlg.insertByName("CancelButton", button)
  button.Label = "Anuluj"
  bc = dc.getControl("CancelButton")
  bc.setPosSize(260, 10, 50, 30, com.sun.star.awt.PosSize.POSSIZE)   
 
rem Dodane pole combi  
  combo = dlg.createInstance("com.sun.star.awt.UnoControlComboBoxModel")
  combo.DropDown = True
  dlg.insertByName("ComboBox", combo)
  cc = dc.getControl("ComboBox")
  cc.setPosSize(10, 50, 200, 30, com.sun.star.awt.PosSize.POSSIZE)

Dim oFormats ' Formats in the current document.
Dim oDane ' Keys queried from the formats.
Dim i as long' General index variable.
Dim sFormat$ ' Current format string.
Dim aLocale as new com.sun.star.lang.Locale

  oFormats = ThisComponent.getNumberFormats()
Rem Początkowy styl daty  
  if aNumer = 0 then  
    cc.text = "YYYY-MM-DD"
    else cc.text = oFormats.getbykey(aNumer).FormatString
  end if
rem lista pola combi  
  oDane = oFormats.queryKeys(2, aLocale, False)'com.sun.star.util.NumberFormat.DATE   
  For i = LBound(oDane) To UBound(oDane)
    sFormat=oFormats.getbykey(oDane(i)).FormatString
    'print oDane(i) & " = " & sFormat
    cc.additem(sFormat,0)	'0 – oznacza numer pozycji na liście	
  Next

  dc.setVisible(True)
  result = dc.Execute()
  if result = 1 then
    DateSelection = cDateFromISO(fc.Date)                      'skasować rem jeżeli jest stosowany OpenO.
rem        DateSelection = cDateFromUNODate(fc.Date)    'skasować rem jeżeli jest stosowany LibreO.
  else
    DateSelection = 0
  end if 
  
End Function

Re: Kalendarz - wybór daty do wpisania do komórki

: ndz sie 25, 2019 6:50 pm
autor: Jan_J
OK, dzięki, jak będę miał spokojny dzień to przejrzę różnice i ew. zbuduję nową wersję oxt.