Makro aktuelles Datum

Das Tabellenkalkulationsprogramm

Moderator: Moderatoren

BMWBiker
*
Beiträge: 13
Registriert: Fr, 11.03.2005 12:54

Makro aktuelles Datum

Beitrag von BMWBiker »

Hallo OO-Experten,
seit kurzer Zeit muss ich mit Calc und Writer arbeiten (davor Excel + Word) und bin dabei, eine Menge "umzustricken".
Meine Bitte: Wie muss ein Makro aussehen, damit beim Öffnen einer Calc-Tabelle der Cursor in die Zelle mit dem aktuellen Datum springt?
Ich hab schon kräftig gesucht, aber nix gefunden.
Danke schon mal im voraus!
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Wie geht das denn in Excel?
Bzw. Was soll erreicht werden?


Gruß
Stephan
BMWBiker
*
Beiträge: 13
Registriert: Fr, 11.03.2005 12:54

Beitrag von BMWBiker »

Sorry, die Antwort als "Gast" kam nur zustande, weil das Login schief ging. Zur Verdeutlichung: Bei dieser Tabelle befindet sich in Spalte A das Datum im Format TTT TT.MM.JJ. In den Spaltenüberschriften B, C, D usw. sind Namen von Mitarbeitern. Das Ganze ist eine Abwesenheitsliste, die der eingetragen wird, wann jemand krank ist, Urlaub hat usw.
Wie gesagt, beim Öffnen der Datei soll die Zelle mit dem aktuellen Datum markiert sein.
Gruß BMWBiker[/quote]
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Binde das folgende Makro als Auto-open-makro in das Dokument ein und ändere die Ausdrücke "Tabelle1" im Makro auf den Namen der Tabelle welche geprüft werden soll:

Code: Alles auswählen

Sub Main
oCellCursor = ThisComponent.Sheets().getByName("Tabelle1").createCursor()
oCellCursor.GotoEndOfUsedArea(True) 
i = 0
Do
	a = ThisComponent.Sheets().getByName("Tabelle1").getCellByPosition(0,i).FormulaLocal
	if i > oCellCursor.getRangeAddress.EndRow then 
		msgbox "Das aktuelle Datum wurde nicht gefunden"
		exit sub
	end if
	i=i+1
Loop while a <> date
oCell =  ThisComponent.Sheets().getByName("Tabelle1").getCellByPosition(0,i-1) 
ThisComponent.GetCurrentController.select(oCell) 
oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges)
End Sub

Gruß
Stephan
BMWBiker
*
Beiträge: 13
Registriert: Fr, 11.03.2005 12:54

Beitrag von BMWBiker »

@ Stephan: Vielen Dank! Das Makro funktioniert, allerdings nicht schon beim Öffnen der Datei, sondern erst über Extras|Makros|Makro|ausführen.
Das Makro habe ich im Modul1 der Datei gespeichert.
Bei Excel ist der Begriff auto_open mit der eindeutigen Funktion verbunden, das Makro beim Öffnen der Datei auszuführen. Gibt es so etwas bei Calc ebenfalls?

Gruß BMWBiker
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

UNter Extras>Anpassen Register Ereignisse dem Ereignis Dokument öffnen zuordnen.
Darauf achten das obeb rechts Dokument und nicht OOo aktiviert ist sonst startet das Makro bei jedem x-belibigen Dokument (im Speziellen geht das natürlich nicht weil Dein Makro in der Dokumentbibliothek ist, ist als nur ein Hinweis falls Du mal später die OOo-Bibliotheken verwenden willst).


Gruß
Stephan
BMWBiker
*
Beiträge: 13
Registriert: Fr, 11.03.2005 12:54

Beitrag von BMWBiker »

Super! Funktioniert exzellent! Genau das habe ich gesucht. Danke nochmal. Wenn ich Dir mal einen Stein in den Garten schmeißen soll, sag mir Bescheid.
Gruß BMWBiker :D
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Lutz,
ch habe das Makro eingebunden, nehme ich jedenfalls an. Beim öffnen der Tabelle mit Namen"Stundenbuch" kommt aber eine Fehlermeldung:
Basic-Laufzeitfehler Es ist eine Exception aufgetreten Type:com.sun.star.container.NoSuchElementException Message: .
Die Tabelle besteht aus mehreren Blättern, Januar,Februar usw. liegt es daran?
Beim Posten von Fehlermeldungen ist es immer hilfreich, auch die Zeile im Basic-Code mit zu posten, welche die Fehlermeldung auslöst. Die ist markiert in der Basic-IDE, die sich mit der Fehlermeldung öffnet!.

Dann zur sprachlichen Genauigkeit: Ich nehme an, deine Datei heisst "Stundenbuch", nicht deine Tabelle? Und diese Datei hat diverse Tabellen (oder Tabellenblätter) mit Namen "Januar", Februar"....?

Das Makro erwartet einen Tabellennamen "Tabelle1" (der Standardname der ersten Tabelle einer neuen Datei). Hast du diese nicht mehr, wird das Makro nicht laufen. Ersetz den Namen halt durch einen existierenden, zum Beispiel "Januar". Dann sollte es gehen.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Lutz,

na ja, wie ich sagte: Offensichtlich hast du kein Tabellenblatt, das "Stundenbuch" heisst. Oder?

Da muss der Name eines Tabellenblattes stehen, so wie du ihn unten auf dem Reiter ablesen kannst (exakte Schreibweise).

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Lutz,

bitte tue mir einen Gefallen: Kopiere den Makrocode und poste ihn hier. Das Suchen in Bildern ist Mühsam und ich habe keine Lust, den Code abzutippen.

Noch etwas: Was steht denn in den jeweiligen Zellen drin ( A36 bsp) - nicht das angezeigte Datatum, sondern die Formel - falls überhaupt?

Meiner Ansicht wird die Bedingung nämlich a <> date nicht erfüllt - daher die Fehlermeldung.

Aber - gib mal weitere Details.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Morgen Lutz,
du kannst mich auch anschreien wenn ich es nicht kapier...
keine Sorge, warum sollte ich dich anschreien?

So, jetzt hab ich den Code mal getestet. Wo hast du den eigentlich her? Meiner Ansicht hat der so nie funktioniert.

Code: Alles auswählen

   a = ThisComponent.Sheets().getByName("Januar").getCellByPosition(0,i).FormulaLocal 
Diese Zeile muss auf jeden Fall heissen:

Code: Alles auswählen

   a = ThisComponent.Sheets().getByName("Januar").getCellByPosition(0,i).value
Mit "FormularLocal" erhälst du die Formel, die in der Zelle steht - und die ist nie identisch mit dem weiter untern erzeugten aktuellen Datum (date).
Mit Value erhälst du den Zellinhalt in seiner internen Darstellung - der kann identisch sein, wenn wirklich nur das Datum drin steht (ich hab es mit jetzt() getestet).
Das Ergebnis des Makros ist, dass die Zele mit dem heutigen Datum selektiert ist - die letzten beiden Zeilen

Code: Alles auswählen

oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges) 
geben meiner Ansicht keinen Sinn mehr (und bewirken auch nichts), könnest du also weglassen.
Oder was sollte damit erreicht werden?

Na ja, wie gesagt, soweit geht das erst mal, für weitere Fragen sind wir da.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Lutz,

hmm, wo ist dein Bild? War da nicht irgendwie noch ein Link zu der Datei?

Also, soweit ich mich erinnere, stand in den oberen Reihen nix?

Na egal, wie gesagt, ich denke, es liegt auch an den Datumswerten. Mir fehlen zu viel Hintergrund-Informationen.

Ändere mal die folgende Zeile:

Code: Alles auswählen

Loop while a <> date 
in

Code: Alles auswählen

Loop while a <> Fix(DateValue(date))
und ergänz mal ganz am Anfang den die folgende Zeile:

Code: Alles auswählen

dim a as double
Jetzt sind zumindest die Zahlenformate identisch - die Schleife sollte funktionieren. (bei mir tut sie es, aber ich hab nur eine Testdatei....)

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Lutz,
Was muss eingegeben werden dass, das Makro die Tabellenblätter von "Januar-Dezember" durchsucht? sonst müsste ich ja das Makro jeden Monat ändern.
Hmm, das kannst du mit einer zusätzliche Schleife lösen - bevor das jetzige Programm losläuft:

Code: Alles auswählen

dim aMonate()
dim flag as boolean
aMonate = Array("Januar", "Februar", "märz") 'Na ja, kannst du selber weiter aufüllen
for m=0 to 11 '12 Monate, wenn nicht, Werte entsprechenc anpassen
  oCellCursor = ThisComponent.Sheets().getByName(aMonate(m)).createCursor()
'...
' Überall, wo bisher ein Monat stand, ersetzen durch aMonate(m)
'....
  if i > oCellCursor.getRangeAddress.EndRow then
      ' die zeile kommt raus
      flag = false  ' die rein
      exit Do
   end if 
    flag = true
    i = i+1
 loop while a<> fix(dateValue(date))
  if flag then exit for
 next
 oCell = ThisComponent.Sheets().getByName(aMonate(m)).getCellByPosition(0,i-1)
ThisComponent.GetCurrentController.select(oCell) 
End sub
(nicht getestet - könnten also noch Fehler drin sein.))
Warum bei dir der 28. November angezeigt wird, weiss ich aber auch nicht so . Systemdatum verstellt?

Aber, es ist ok, wenn du mir die Datei zusendest. Dann kann ich draufschauen.
Bitte im Anschreiben bestätigen, dass kein "schadlicher Code" drin ist!
meine mail-Adresse: thomaskrumbein(at)openoffice.org

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Lutz,

also, das Makro war schon ok, hättest du es richtig abgetippt :D
OK, ich hatte nur geänderte Zeilen gepostet - und vielleicht nicht immer klar genug. Aber egal, hier das (funktionstüchtige) kompwette Makro:

Code: Alles auswählen

Sub Datum
 dim aMonate()
 dim flag as boolean
 aMonate = Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember")
 for m = 0 to 11
	oCellCursor = ThisComponent.Sheets().getByName(aMonate(m)).createCursor()
	oCellCursor.GotoEndOfUsedArea(True)
	i = 0
	Do
	  oCell = ThisComponent.Sheets().getByName(aMonate(m)).getCellByPosition(0,i)
	  a = oCell.value
 	  if i > oCellCursor.getRangeAddress.EndRow then
      	flag = false  
      	exit Do
   	  end if
      flag = true
      i = i+1
 	loop while a<> fix(dateValue(date)-2) 'die -2 ist der Korrekturfaktor zur internen Berechnung
    if flag then exit for
 next 
    if not flag then
	 	msgbox "Das aktuelle Datum wurde nicht gefunden"
     	exit sub 
    end if
 ThisComponent.GetCurrentController.select(oCell)
End Sub
Ich hab es gleich einmal ein wenig gekürzt und optimiert.
Einen Fehler jedoch habe ich auch lange gesucht.... Wo hatest du die Tabelle ursprünglich her?
Dort steht nämlich tatsächlich als Kalkulationsdatum in den Optionen der 01.01.1900 und nicht - wie üblich - der 30.12.1899. Also muss ein Korrekturfaktor von 2 (zwei Tagen) eingebracht werden, damit es wieder stimmt.
Soweit ok, jetzt sollte es funktionieren (bei mir geht es jedenfalls :D )

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
s-und-s
Beiträge: 2
Registriert: Mi, 15.02.2006 15:08

Beitrag von s-und-s »

Hallo,
ich bin erstaunt, wie komplex das in OpenOffice ist,
in Excel hatte ich dafür immer nur einen 3-Zeiler benötigt.
Vielleicht kann das einer von Euch in OpenOffice umsetzen:

Code: Alles auswählen

'----------------------------------------------------------------------------
' Sprung in Tabelle und  Zelle des jeweiligen Tagesdatums
' Tabellen sind Januar, Februar, Maerz, April, ...
' Die Tage jeden Monats sind jeweils ab Zelle A2 abwärts aufgereiht
' -----------------------------------------------------------------------------
    ThisWorkbook.Worksheets(Month(Date)).Activate
    Range("A1").Select
    ActiveCell.offset(Day(Date), 1).Select
Grüße,
Josef Sterk
Antworten