Makro aktuelles Datum

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Makro aktuelles Datum

von s-und-s » Do, 16.02.2006 11:17

Hi,
ich glaub ich kann mir die Antwort selber geben.
Mit folgendem Code setze ich den Cursor auf die Zelle mit dem aktiven Datum.

Code: Alles auswählen

ThisComponent.CurrentController.Select((ThisComponent.Sheets(Month(Now)-1).getCellByPosition(0,Day(Now)))
Berechnet wird das Sprungziel über die Funktion Month(Now) und Day(Now).
Weil die Sheet-Index bei 0 beginnt, muß vom Monat noch 1 subtrahiert werden.

Wenn der Monatsbeginn nicht in Zeile 2 beginnt, dann muß man halt noch einen Offset hinzuaddieren. Dasselbe gilt, wenn man andere Spalten als Spalte A wünscht.

Grüße,
Josef Sterk

von s-und-s » Mi, 15.02.2006 15:39

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

von Toxitom » So, 27.11.2005 10:18

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

von Toxitom » Sa, 26.11.2005 10:54

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

von Toxitom » Fr, 25.11.2005 15:17

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

von Toxitom » Fr, 25.11.2005 08:26

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

von Toxitom » Do, 24.11.2005 13:27

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

von Toxitom » Do, 24.11.2005 10:01

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

von Toxitom » Do, 24.11.2005 08:36

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

von BMWBiker » Mo, 14.03.2005 15:09

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

von Stephan » Mo, 14.03.2005 13:15

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

von BMWBiker » Mo, 14.03.2005 09:34

@ 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

von Stephan » Sa, 12.03.2005 21:35

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

von BMWBiker » Sa, 12.03.2005 19:46

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]

von Stephan » Fr, 11.03.2005 15:17

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


Gruß
Stephan

Nach oben