Hallo Verstancla,
sorry, wenn ich Verwirrung gestiftet habe, dass war nicht meine Absicht.
Verstancla hat geschrieben:Funktion nirgends ein If in einer Variablen verwendet.
Das ist richtig, ich wollte nur klarstellen, dass man keine Basicbefehle für
die Namensvergabe bei für die Variablen-Deklaration verwenden darf, da es sonst zu Konflikten
mit dem Basic-Interpreter kommt und dann entsprechende Fehler produziert werden.
Verstancla hat geschrieben:Wieso braucht es noch ein Extra-Makro
Ein Funktion ist wie der Name schon sagt eine Funktion, also so etwas wie eine Calc-Formel, für Berechnungen und Textfunktionen, etc.
Ausserdem gibt es Programmier-Umgebungen, wo eine Funktion alleine nicht abgerabeitet werden kann. Sie muss dort immer aus einer Sub-Routine oder anderen Routinen heraus aufgerufen werden.
Des Weiteren kann man an Funktionen Parameter binden, dann kommt es bei der Ausführung (auch in Starbasic) zu Laufzeit-Fehlern.
Die geforderten Übergabe-Parameter dieser Funktion sind im Funktionsnamen vorgegeben
Function FileNameoutofPath(ByVal Path as String, ...
Diese Funktion fordert den Parameter
ByVal Path as String
Wenn ich die Funktion direkt ausführe, dann Laufzeit-Fehler.
Rufe ich die Funktion aus ein Sub-Routine aus und übergebe die geforderten Parameter, dann ist alles OK:
Für das Beispiel muss auf der Festpallte eine Datei namens
Test.txt vorhanden
sein und sie muss im Ordner
C:\temp gespeichert sein.
Beispiel:
Code: Alles auswählen
REM ***** BASIC *****
Sub MeinMakro
Dim sPath as String
' Laden der Bibliothek "LibreOffice-Makros und -Dialoge/Tools"
GlobalScope.basicLibraries.loadLibrary("Tools")
' Funktionsaufruf: FileNameoutofPath()
' Parameter-Übergabe: "C:\temp\Test.txt"
sPath= FileNameoutofPath("C:\temp\Test.txt")
Msgbox sPath
End Sub
Verstancla hat geschrieben:wieso ist der Variablen-Name oSheet nicht Okay?
Weil oSheet ein einzelnes Tabellenblatt darstellt und nicht die gesamte Calc-Datei.
Dies hat sich so weltweit eingebürgert.
OOME-Handbuch
Die
Calc-Datei wird so deklariert und referenziert.
„oDoc“ ist aber nicht das Objekt „ThisComponent“, sondern ein Zeiger auf das Objekt „ThisComponent“
Bildlich gesehen:
Ein Haus mit der Hausnummer 1.
Du stehst auf der anderen Straßenseite und sagst dem Basic-Interpreter mit zeigendem Finger:
"Ich möchte dieses Haus mit der Hausnummer 1 betreten."
Mehr ist oDoc oder oSheet, usw. nicht.
Warum deklariert man dann Objektvariable (oDoc uznd Co.)?
Wenn ich z.B. einen langen Code schreiben will, dann ist es ziemlich lästig, permanent „ThisComponent“ zu schreiben, „oDoc“ ist viel kürzer. Arbeitet mein Makro z.B. in zwei Calc-Dateien, dann benenne ich die Objektvariable z.T. auch so:
oDocCalc1
oDocCalc2
Daraus folgt für das Tabellenblatt diese Deklaration und Referenzierung, wobei
ich direkt angebe, ob ich in „Tabelle1“ oder in „Tabelle2“ arbeiten möchte:
Code: Alles auswählen
Dim oSheet1 as Object
'Referenziert das gewünschte Tabellenblatt
oSheet1=oDoc.getSheets().getByIndex(0)
REM ODER → → → : oSheet1=oDoc.getSheets().getByName("Tabelle1")
hat geschrieben:Die Funktion habe ich aus dem Forum kopiert, dessen Entwickler sie als funktionierend anpries.
Nun ja, es gibt solche und solche Programmierer.
Das reicht von „Quick’n dirty“ über Unwissenheit bis peinlich genau. Jeder halt so wie er es mag.
Ich
bin stets bemüht 
etwas sauberer zu arbeiten, vorallem deshalb, weil es mir dann auch nach Jahren leichter fällt meine eigenen Codes zuverstehen.
Also versuche ich mich ein wenig an den gebräuchlichen Konventionen zu orientieren und die Codes auch so zu schreiben.
Und weil ich gerade eine so große Klappe habe, hier die verbesserte Version meines zuvor geposteten Codes:
Code: Alles auswählen
REM ***** BASIC *****
Option Explicit
Dim oDoc as Object
Dim oSheet1 as Object
Sub meinMakro
'Referenziert das aktuelle Dokument
oDoc=ThisComponent
'Referenziert das gewünschte Tabellenblatt
oSheet1=oDoc.getSheets().getByIndex(0)
REM ODER → → → : oSheet1=oDoc.getSheets().getByName("Tabelle1")
Msgbox "Heutiges Datum = " & Changedon
End Sub
Function Changedon() as Date
Dim vChgDate as Variant
vChgDate=oDoc.DocumentProperties.ModificationDate
If vChgDate.Year=0 Then
vChgDate=oDoc.DocumentProperties.CreationDate
End If
Changedon=Dateserial(vChgDate.Year, vChgDate.Month, vChgDate.Day)
End Function
Ich bin trotz meines Wissens weiter davon entfernt ein Profi zu sein.
Wenn noch etwas unklar, dann melde Dich bitte.