[Window Title]
C:\jckalendarz.xlam
[Content]
Wystąpiły problemy z przesłaniem polecenia do programu.
[OK]
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
Jan_J napisał(a):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.
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
Powrót do Makra i programowanie
Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość