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:
- Otworzyć nowy arkusz kalkulacyjny
- Kliknąć prawym klawiszem myszki na któryś z pasków narzędzi, np. górny i wybrać Dostosuj pasek narzędzi...
- 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ą.
- Następnie kliknąć Dodaj...
- W otwartym okienku Dodaj, na liście Kategoria odnaleźć Makra LibreOffice i rozwinąć ją aż do Moje makra/CalendarDlg/Module1
- Na liście Polecenia wskazać InsertDate i kliknąć Dodaj, a potem Zamknij.
- 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.
- Teraz ponownie kliknąć Modyfkuj... i z otwartej listy wybrać Zmień ikonę.
- W okienku odnaleźć jakąś stosowną ikonę, np. .uno:AddDateField i kliknąć ją. Następnie kliknąć OK
- 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.