Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


Hallo,

der Tipp war 1. Klasse. Musste noch ein paar Änderungen vornehmen und dann hat es geklappt.

Hier noch eine kurze Anleitung:
**********************************************************************************************************************************
Folgendes Problem:
Mit MS Excel kann man das heutige Datum mit "strg+H" statisch einfügen (das heißt, es wird immer 
genau dieses Datum bleiben). 
Dies ist mit LibreOffice nicht so einfach möglich. Bei einigen Benutzern, war diese Funktion aber 
immer sehr wichtig. 

Um Abhilfe zu schaffen, geht man wie folgt vor:

1. In LibreOffice Calc unter Extras -> Makros -> Makros verwalten -> LibreOffice Basic ...
2. Die Dropdown-Auswahl von "Meine Makros" expandieren
3. Die Dropdown-Auswahl von "Standard" expandieren
4. Auf das "Module1" klicken und rechts "Bearbeiten wählen"
5. Im Bearbeitungsfenster sämtlichen Code mit diesem ersetzen:

REM*****BASIC*****
' ! ! !
' anpassen:
' Die zwei folgenden Konstanten bestimmen Datum- und Zeit-Formatcodes 
' Siehe in der F1 Hilfe; sie müssen im Gebietsschema gültig sein.

' adjust:
' following constants define data and time formats to be used;
' for codes to use see in F1 Help. 
' Codes have to be set according to your locale settings

Const  MYDATEFORMAT = "TT.MM.JJJJ"
' Const MYDATEFORMAT = "YYYY-MM-DD"
Const MYTIMEFORMAT = "HH:MM"

' V2
' Format eines Zeitstempels
' Const MYTIMESTAMPFORMAT = "YYYY-MM-DD HH:MM"
Const MYTIMESTAMPFORMAT = "TT.MM.YYYY HH:MM"

' this one is used as separator in
' an ISO-formatted date: 2007-06-24
Const cDateTime_TRENNER = "."


' V2
' neue Schalter für Calc: 
' "Überschreiben- oder Einfügen-" Schalter,
' bei Einfügen: Positionsbestimmung (vor oder hinter vorhandenem Inhalt) 
' bei Einfügen: Trennzeichen (nur beim Einfügen als Text ! )

' new switches to define Calc override / insert behaviour 
' (only with text insertions) 

Const cDateTime_Calc_Add2Text_Switch    = TRUE     
' TRUE: add insert to any existing text or value  
' FALSE: replace text or value (if any)

Const cDateTime_Calc_Add2Text_Position  = "POST"   
' PRE: set insert ahead of an existing text       
' POST: set insert after text 

Const cDateTime_Calc_Add2Text_Separator = ": "     
' definition of part between text and insert 


' used for displaying messages
Const cMODULNAME = "DateTime "
Const cMODULDATUM = "15.08.2007 "
Const cMODULVERSION = "2.0.1 "
' Variablen -------------------------------------------------------------
Private oDesktop
Private oController
Private oDokument
Private oTextCursor
Private oViewCursor

Private oSelection
Private oBereich
Private oZelle
Private oDateTimeField
Private nDateTime_Format_DATE
Private nDateTime_Format_TIME
Private nDateTime_Format_DATETIME
Private oZellEinf as Any
Private oZumEinfuegen
Private nDateTime_SetFormat
Private sDatum

Private sDateTime_setAs   ' val txt
Private sDateTime_setWhat ' DAT TIM
Private sDateTime_DocType ' kind of doc
Private sDateTime_DATE as String 'iso
Private sDateTime_FISO as String ' form. iso
Private sDateTime_DATETIME as String ' iso w/ time
Private sDateTime_TIME as String
Private lDateTime_DATE as Long

Private dblDateTime_TIME as Double

Private oText


CONST cEinzelZelle   = "com.sun.star.sheet.SheetCell"
CONST cVieleBereiche = "com.sun.star.sheet.SheetCellRanges"
CONST cEinzelBereich = "com.sun.star.sheet.SheetCellRange"


' Schalter fuer Cursorposition in Textdokumenten
Private CursorIstHier as Integer
CONST CURPOS_InText = 1
CONST CURPOS_InTabelle = 2
CONST CURPOS_InRahmen = 3
CONST CURPOS_InHeaderFooter = 4

CONST CURPOS_INVALID = 9


' ===========================================================================
'
' M A I N
'
' ===========================================================================

' Eine dieser SUBs aufrufen, einer Symbolschaltfläche oder einer
' Tastenkombination zuordnen. Das Makro erkennt selbst den Dokumententyp.
' (Momentan nur Calc und Writer)
'
' call one of these SUBs, assign to toolbar button or to keyboard combination
' The macro detects document type (calc and writer)
' ===========================================================================

' << Datum als FELD oder WERT
' Sub insert_Date_asField()

Sub Datum_Feld
        sDateTime_setAs   = "val"
        sDateTime_setWhat = "DAT"
        DateTime_Init
        DateTime_action
End Sub


' << Datum als Text
' Sub insert_Date_asText()

Sub Datum_Text
        sDateTime_setAs   = "txt"
        sDateTime_setWhat = "DAT"
        DateTime_Init
        DateTime_action
End Sub



' << Zeit als FELD oder WERT
' Sub insert_Time_asField()

Sub Zeit_Feld
        sDateTime_setAs   = "val"
        sDateTime_setWhat = "TIM"
        DateTime_Init
        DateTime_action
End Sub

' << Zeit als Text
' Sub insert_Time_asText()

Sub Zeit_Text
        sDateTime_setAs   = "txt"
        sDateTime_setWhat = "TIM"
        DateTime_Init
        DateTime_action
End Sub


'
' << Zeitstempel als Text

Sub Zeitstempel_Feld
        sDateTime_setAs   = "val"
        sDateTime_setWhat = "T_S"
        DateTime_Init
        DateTime_action
End Sub

' << Zeitstempel als Text

Sub Zeitstempel_Text
        sDateTime_setAs   = "txt"
        sDateTime_setWhat = "T_S"
        DateTime_Init
        DateTime_action
End Sub


' ===========================================================================
' Allgemeiner Codeteil
'
' ===========================================================================

' Aktuelles Dokument
'
Sub DateTime_Init
oDesktop = _
 createUnoService( "com.sun.star.frame.Desktop" )
oController = _
 oDesktop.getCurrentFrame().getController()
oDokument = _
 oController.Model
If NOT DateTime_isDocTypeOK( oDokument ) then
        ' Dokumententyp nicht unterstützt
        Msgbox _
        "Dokumententyp wird nicht unterstützt" _
        ,64, _
        cMODULNAME & "V " & cMODULVERSION

'       print "Dokument not supported"
        STOP
End If

' diese Zeit nehmen/speichern
DateTime_secureNow

If sDateTime_setAs = "val" Then
 ' Aufbereiten der gewünschten Formatierung
 DateTime_setNumFormat
End If

End Sub




' Bestimmen des Dokumententyps
' aktuell: Writer, Calc, HTML
Function DateTime_isDocTypeOK( oDok ) as Boolean
DateTime_isDocTypeOK = FALSE

If oDok.supportsService(_
 "com.sun.star.text.TextDocument" ) Then
 sDateTime_DocType = "WRITER"
 DateTime_isDocTypeOK = TRUE
 Exit Function
ElseIf oDok.supportsService(_
 "com.sun.star.text.WebDocument" ) THEN
 sDateTime_DocType = "WRITERWEB"
 DateTime_isDocTypeOK = TRUE
 Exit Function
ElseIf oDok.supportsService(_
 "com.sun.star.sheet.SpreadsheetDocument" ) Then
 sDateTime_DocType = "CALC"
 DateTime_isDocTypeOK = TRUE
 Exit Function
Else
 sDateTime_DocType = "-n/a-"
 DateTime_isDocTypeOK = FALSE
End If

End Function

' ===========================================================================
' Codeteil fuer Datum
'
'
' ===========================================================================
Sub DateTime_secureNow
' lokales speichern der Systemzeit
' nummerische Werte
lDateTime_DATE = DateValue( NOW ) '
dblDateTime_TIME = CDbl( NOW )
' Zeichenfolgen
' Das Rueckgabeformat der Funktion "Date" ist von dem Gebietsschema
' abhaengig, deshalb gewuenschtes Format durch Textmanipulation
' zusammensetzen
' msgbox Date zeigt: 21.11.2005
 ' Right(Date,4) & "-" & Mid(Date,4,2) & "-" & left(Date,2)
 ' soll: JJJJ-MM-TT 2005-11-21
sDateTime_DATE = CDateToISO( Now )
' now: jjjjmmtt 20051121'
' use this variable if needed
'

' compose a ISO formatted date
sDateTime_FISO = _
 Left( sDateTime_DATE, 4 ) & _
 cDateTime_TRENNER & _
 Mid( sDateTime_DATE, 5 , 2 ) & _
 cDateTime_TRENNER & _
 Right( sDateTime_DATE, 2 )
 ' durch Apostroph erzwungenes Textformatnumber
 ' forced text format


' die Funktion TIME gibt 12:34:56
' im Format hh:mm:ss zurück
' Textteil ausschneiden
sDateTime_TIME = _
 Mid( TIME, 1, 5 )

' Zeitstempel zusammen setzen
sDateTime_DATETIME = _
 sDateTime_FISO & _
 " " & _
 sDateTime_TIME


End Sub

Sub DateTime_setNumFormat
' Abfragen ob gewuenschtes Format schon definiert
' hier: benutzerdefiniertes Datumsformat
' query if user-defined date format already in locale settings
Dim aLocale As New com.sun.star.lang.Locale

oFormats = _
 oDokument.NumberFormats

nDateTime_Format_DATE = _
 oFormats.queryKey( MYDATEFORMAT, aLocale, True )
' Schluesselwert nicht gefunden: hinzufuegen Format
' format not found - key not returned: add format
If nDateTime_Format_DATE < 0 Then
 nDateTime_Format_DATE  = _
 oFormats.addNew( MYDATEFORMAT, aLocale )
End If

nDateTime_Format_TIME = _
 oFormats.queryKey( MYTIMEFORMAT, aLocale, True )

' Schluesselwert nicht gefunden: hinzufuegen Format
' format not found - key not returned: add format
If nDateTime_Format_TIME < 0 Then
 nDateTime_Format_TIME = _
 oFormats.addNew( MYTIMEFORMAT, aLocale )
End If




nDateTime_Format_DATETIME = _
 oFormats.queryKey( MYTIMESTAMPFORMAT, aLocale, True )

' Schluesselwert nicht gefunden: hinzufuegen Format
' format not found - key not returned: add format
If nDateTime_Format_DATETIME < 0 Then
 nDateTime_Format_DATETIME = _
 oFormats.addNew( MYTIMESTAMPFORMAT, aLocale )
End If


End Sub








' Hauptroutine zur Arbeitssteuerung
'
Sub DateTime_action()

' on what document do we work
Select Case sDateTime_DocType

 Case "CALC" ' Calc Dokument
        ' die Auswahl (Zelle/n, Bilder, andere Objekte)
        oSelection = oController.getSelection()

        If IsNull( oSelection ) Then
         Exit Sub
        End If

        ' Fehlerbehandlung: keine Zelle(n)
        ' error handling: no cell(s) selected
        If Not oSelection.supportsService(_
         "com.sun.star.table.CellProperties" ) Then
         exit sub
        End If


        Select Case sDateTime_setWhat & sDateTime_setAs
         Case = "DATval"
                oZellEinf = lDateTime_DATE
                nDateTime_SetFormat = nDateTime_Format_DATE
         Case = "DATtxt"
                oZellEinf = sDateTime_FISO
         Case = "TIMval"
                oZellEinf = dblDateTime_TIME
                nDateTime_SetFormat = nDateTime_Format_TIME
         Case = "TIMtxt"
                oZellEinf = sDateTime_TIME
         Case = "T_Sval"
                oZellEinf = dblDateTime_TIME
                nDateTime_SetFormat = nDateTime_Format_DATETIME
         Case = "T_Stxt"
                oZellEinf = sDateTime_DATETIME
         Case Else
                 Exit Sub
        End Select

        DateTime_setCalc( oSelection , oEinf )


 Case "WRITER" , "WRITERWEB" ' Writer Dokument
        ' als Wert
        if sDateTime_setAs= "val" then

                ' Textfeld erzeugen
                oDateTimeField = oDokument.createInstance( _
                        "com.sun.star.text.TextField.DateTime" )
                ' einstellen:
                        ' Schalter "fest" = wird zur Ausfuehrung gesetzt und nicht geaendert
                        ' Schalter "ist ein Datum" einstellen
                        ' ermitteltes Datumsformat (ist Nummernformat) anwenden
                        ' apply date (number) format
                Select Case sDateTime_setWhat
                        Case = "DAT"
                                nDateTime_SetFormat = nDateTime_Format_DATE
                        Case = "TIM"
                                nDateTime_SetFormat = nDateTime_Format_TIME
                        Case = "T_S"
                                nDateTime_SetFormat = nDateTime_Format_DATETIME
                        Case Else
                            Exit Sub
                End Select

                With oDateTimeField
                        .IsFixed = True
                        .IsDate = True
                        .NumberFormat = nDateTime_SetFormat
                End With
                ' in das Dokument eintragen
                oZumEinfuegen = oDateTimeField
                DateTime_setWriter( oZumEinfuegen )


        ' als Text
        Else
                ' in das Dokument eintragen
                Select Case sDateTime_setWhat
                        Case = "DAT"
                                oZumEinfuegen = sDateTime_FISO
                        Case = "TIM"
                                oZumEinfuegen = sDateTime_TIME
                        Case = "T_S"
                                oZumEinfuegen = sDateTime_DATETIME
                        Case Else
                                Exit Sub
                End Select


                DateTime_setWriter( oZumEinfuegen )

        End If

 Case Else
         print "forgotten doc type"

End Select

End Sub
' ===========================================================================





' ===========================================================================



' ===========================================================================
' Routine zum Eintragen Writer
Sub DateTime_setWriter( sFeldZumEinfuegen )

' Objekt des sichtbaren Cursors
oViewCursor = oController.ViewCursor

' Routine aufrufen
' Cursorstandort bestimmen
' determine where the cursor is
DateTime_suchTxtCursor( oViewCursor )


' je nach Position des Cursors unterschiedlicher Zugriff
' different access depending on cursor position
Select Case CursorIstHier

        '----------------------------------------------------------------------------
        ' cursor in text
        Case CURPOS_InText
                if sDateTime_setAs= "val" then
                        oDokument.getText().insertTextContent( _
                        oViewCursor, oZumEinfuegen , False )
                else
                        oTextCursor = _
                        oDokument.getText().createTextCursorByRange( oViewCursor )
                        oTextCursor.String = oZumEinfuegen
                end if
        '---------------------------------------------------------------------------- 
        'cursor in texttable
        Case CURPOS_InTabelle
                oZelle = oViewCursor.Cell
                if sDateTime_setAs= "val" then
                        oZelle.getText().insertTextContent( _
                        oViewCursor, oZumEinfuegen, False )
                else
                        oTextCursor = oZelle.getText().createTextCursorByRange( oViewCursor )
                        oZelle.insertString( oTextCursor, oZumEinfuegen, FALSE )
                end if
        '---------------------------------------------------------------------------
        ' cursor in frame
        Case CURPOS_InRahmen
                if sDateTime_setAs= "val" then
                        oRahmen = oViewCursor.TextFrame()
                        oRahmen.getText().insertTextContent( _
                        oViewCursor, oZumEinfuegen, False )
                else
                        oRahmen = oViewCursor.TextFrame()
                        oRahmen.getText().insertText( _
                        oViewCursor, oZumEinfuegen, False )
                end if
        '---------------------------------------------------------------------------
        ' in Kopf- oder Fusszeile
        ' cursor in header or footer
        Case CURPOS_InHeaderFooter
                if sDateTime_setAs= "val" then

                        ' Feld einfügen
                        ' insert field
                        oText.insertTextContent( _
                        oViewCursor, oZumEinfuegen, False )
                else
                        oTextCursor = oText.createTextCursorByRange( oViewCursor )
                        oText.insertString( oTextCursor, oZumEinfuegen, FALSE )
                end if
        '---------------------------------------------------------------------------
        Case Else
                ' not yet programmed
End Select

End Sub


' ===========================================================================
' Diese Routine bestimmt die Position des sichtbaren Cursors im Text eines
' Writer Dokuments
' momentan wird die Position erkannt in: 
' Tabellen, Textrahmen, Kopf- und Fusszeilen

' This routine determines position of viewable cursor within a writer doc
' detects: cursor in texttable, textframe, header and footer
Sub     DateTime_suchTxtCursor( oViewCursor )

' init Zeiger fuer Position
CursorIstHier = 0


' Sonderfall: Cursor im Bereich Kopf-/Fusszeile
if oViewCursor.getText().ImplementationName = "SwXHeadFootText" then
        oText = oViewCursor.getText()
        CursorIstHier = CURPOS_InHeaderFooter
        exit sub
end if

if Not IsEmpty( oViewCursor.TextTable ) then
        CursorIstHier = CURPOS_InTabelle
        exit sub
end if

if Not IsEmpty( oViewCursor.TextFrame ) then
        CursorIstHier = CURPOS_InRahmen
        exit sub
end if


' Cursor ist immer "im Text", deshalb diesen Schalter zuletzt setzen
' cursor always "in" text, so set this trigger last
if Not IsEmpty( oViewCursor.Text ) then
        CursorIstHier = CURPOS_InText
end if

End Sub





' ===========================================================================
' Calc Dokumente

Sub DateTime_setCalc( oSelection , oEinf )
Dim oEinBereich

' Zelle / Bereich / mehrere Bereiche ?

If      oSelection.supportsService( cEinzelZelle ) Then
' single cell
    DateTime_setZelle( oSelection )
ElseIf _
        oSelection.supportsService( cVieleBereiche ) Then
        ' mehrere Bereiche
    For i = 0 To oSelection.getCount() - 1
      oEinBereich = oSelection.getByIndex(i)
      DateTime_setCalc( oEinBereich )
    Next
ElseIf _
        oSelection.supportsService( cEinzelBereich ) Then
'       ein Bereich von Zellen
    DateTime_set1Bereich( oSelection )
End If

End Sub


' Calc
' einzelne Zelle
Sub DateTime_setZelle( oSel )

If sDateTime_setAs= "val" Then
 ' Wert geht über Formatierung
 With oSel
  .FormulaLocal = oZellEinf
  .NumberFormat = nDateTime_SetFormat
 End With
Else
' sDateTime_setAs= "txt"
  ' V2
  If cDateTime_Calc_Add2Text_Switch = TRUE Then
    Dim sTempText
    sTempText = oSel.getString()
    If ( Len( sTempText ) > 0 ) Then
       Select Case cDateTime_Calc_Add2Text_Position
         Case = "PRE"
             sTempText = _
               oZellEinf & _
               cDateTime_Calc_Add2Text_Separator & _
               oSel.getString()
               oSel.setString( sTempText )

         Case = "POST"
             sTempText = _
               oSel.getString() & _
               cDateTime_Calc_Add2Text_Separator & _
               oZellEinf
               oSel.setString( sTempText )
         Case Else
           Exit Sub
         End Select
    Else
          oSel.setString( oZellEinf )
        End IF
        
  Else
    oSel.setString( oZellEinf )
  End IF
End If
End Sub


' Calc
' einen Bereich von Zellen setzen
Sub DateTime_set1Bereich( oSelection )

' Daten des Bereichs
oDaten() = oSelection.getDataArray()
' die Zeilen des Bereichs
' zz: ZählerZeilen
for zz = _
        LBound( oDaten() ) to _
        UBound( oDaten() )

        oDatenZeile() = oDaten( zz )
        ' zz: ZählerZeilen

        ' pro Zeile die cells/Zellen
        ' zc: ZählerCells
        for zc = _
                LBound( oDatenZeile() ) to _
                UBound( oDatenZeile() )

                oDatenZeile( zc ) = oZellEinf
        next ' Zellen
next ' nächste Datenzeile


' Daten auf diesen Bereich
oSelection.setDataArray( oDaten() )
If sDateTime_setAs= "val" Then
 ' Datumformat (ist ein Nummernformat) anwenden
 ' apply date (number) format
 oSelection.NumberFormat = nDateTime_SetFormat
End If

End Sub

' -------------------------------------------------------

5a. Bearbeitungsmodus schließen
6. Einen Rechtsklick auf eine Symbolleiste machen und "Symbolleiste anpassen" wählen
7. Den Reiter "Tastatur" wählen und den Eintrag strg+H suchen und markieren
8. Im unteren Bereich im linken Fensterchen LibreOffice Makros wählen und dort folgenden Pfad 
expandieren "user-> Standard-> Module1"
9. Im nächsten Fenster nach rechts den Eintrag "Datum_Feld" wählen
10. Oben auf "Ändern" klicken. Dem Makro wird die Tastenkombination strg+H hinzugefügt

Fertig
***************************************************************************************************************************************

Hoffe das es noch einige andere gebrauchen können.

Viele Grüße
Kai Klostermann

-----Ursprüngliche Nachricht-----
Von: Rainer Bielefeld [mailto:LibreOffice@bielefeldundbuss.de] 
Gesendet: Friday, September 30, 2011 9:10 AM
An: users@de.libreoffice.org
Betreff: Re: [de-users] Calc - heutiges Datum einfügen

Oder
<http://extensions.services.openoffice.org/project/DateTime2>

Rainer

-- 
Informationen zum Abmelden: E-Mail an users+help@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert


-- 
Informationen zum Abmelden: E-Mail an users+help@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.