Hallo Rolli,
zunächst einmal:
Die Deklaration Deiner Variablen ist falsch.
Die Starbasic-Progammierung bedarf einiger Einarbeitungszeit.
Die Komplexität wird ersichtlich, wenn Du Dich mit dem API (Application Programming Interface) auseinander setzt.
Man kann das API von AOO und LibO nutzen, wobei diese sich langsam auseinander bewegen.
Das was unter AOO läuft, muss nicht zwingend auch unter LibO laufen und umgekehrt.
Die Dokumentation des jeweiligen API:
https://api.libreoffice.org/docs/idl/ref/files.html
http://www.openoffice.org/api/docs/comm ... le-ix.html
https://wiki.openoffice.org/wiki/MediaW ... ASIC_Guide
Um sich in der API besser zurecht zu finden, nutze ich beim Programmieren die Codeinspektions-Tools MRI und/ oder XRAY.
Mit Aufruf eines dieser Tools kann man z.B. Objekte, wie Sheets untersuchen. Dabei werden einem die Eigenschaften, Methoden, Schnittstellen, und vieles mehr angezeigt.
Mit den angezeigten Informationen ist es dann möglich gezielt in der API nach den richtigen Einstellungen und Anwendungsmöglichkeiten zu suchen.
Die Download-Links der Inspektionstools befinden sich in diesem Code:
Code: Alles auswählen
REM ***** BASIC *****
REM Bibliotheken bei LibreOffice-Start laden
Sub LoadingLibraries
' Hier in der Basic-IDE -> Objektkatalog
' LibreOffice Makros & Dialoge -> Tools
' Globalscope.BasicLibraries.LoadLibrary ( "Tools")
' load TOOLS library with helper function
If NOT GlobalScope.BasicLibraries.isLibraryLoaded( "Tools" ) Then
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
End If
'https://extensions.openoffice.org/en/project/mri-uno-object-inspection-tool
' Für Libreoffice: https://extensions.openoffice.org/en/projectrelease/mri-uno-object-inspection-tool-133
If NOT GlobalScope.BasicLibraries.isLibraryLoaded( "MRILib" ) Then
Globalscope.BasicLibraries.LoadLibrary ( "MRILib")
End If
' https://wiki.openoffice.org/wiki/DE/Makro_Basic_Tutorial
'http://berma.pagesperso-orange.fr/Files_en/XrayTool60_de.odt
If NOT GlobalScope.BasicLibraries.isLibraryLoaded( "XrayTool" ) Then
GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
End If
End Sub
Was bewirkt dieser Code?
Der Code dient dazu, die darin angegeben Makro-Bibliotheken direkt bei Office-Start zu laden:
- Damit stehen einem die verschiedene Makros und Funktionen der Bibliothek „Tools“ zur Verfügung. Dieses sind vorgefertigte kleine Programme, welche von AOO/ LibO mitgeliefert werden.
- Lädt die Bibliothek „MRILib“, damit das Tool MRI ausführbar ist.
- Lädt die Bibliothek „XRAYTool“, damit das Tool XRAY ausführbar ist.
- Die IF-Anweisung prüft lediglich, ob die Bibliothek bereits geladen wurde. Wäre dies der Fall, dann würde die Bibliothek nicht ein zweites mal geladen.
Bei Programmstart ist diese Anweisung eigentlich überflüssig. Sie dient mir lediglich mich daran zu erinnern, wie man prüft, ob eine Bibliothek bereits geladen wurde. So kann ich per c&p z.B. den Abschnitt für die Prüfung ist „Tools“ schon geladen, in anderen Codes verwenden.
Dieses ist erforderlich, wenn ich in einem Code Funktionen aus der Bibliothek „Tools“ nutze und eine Dokument mit Makros weitergeben möchte. Da ich nicht weiß, ob der nächste Anwender meines Programms die Bibliothek „Tools“ ebenfalls geladen hat, wird in meinem Code eben geprüft, ob dies der Fall ist oder nicht.
Code: Alles auswählen
' load TOOLS library with helper function
If NOT GlobalScope.BasicLibraries.isLibraryLoaded( "Tools" ) Then
GlobalScope.BasicLibraries.LoadLibrary( "Tools" )
End If
Nachfolgendes sollte man nicht immer als schwarz/ weiß Sicht verstehen, die Übergänge können fließend sein.
Was ist eine Eigenschaft und was ist eine Methode?
- Die Farbe ROT ist eine Eigenschaft.
- Jetzt könnte man meine, das die Liniendicke einer Zellumrandung ebenfalls eine Eigenschaft ist.
Diese ist aber nicht der Fall, weil „Boderline“ ein Structure ist, eine Struktur welche die Eigenschaften der Linie beschreibt.
Siehe hier:
https://www.openoffice.org/api/docs/com ... rLine.html
Die Deklaration des Struct erfolgt so:
dim aBorder as new com.sun.star.table.BorderLine
Das Präfix „a“ von aBorder, weit daraufhin, dass es sich um eine Struct-Variable handelt.
Siehe dazu auch hier: Konventionen
https://wiki.openoffice.org/wiki/DE/Mak ... c_Tutorial
- Ein Klick-Event ist eine Methode.
Auch wenn man eine Objektvariable erstellen möchte, handelt es sich um eine Methode:
auch hier entspricht das Präfix wieder der Konvention:
o = Object
Was ist eine Objekt?
Stardesktop
ThisComponent
Sheets
Sheet
Drawpage
usw.
Daraus folgt nun in Deinem Fall:
Code: Alles auswählen
Dim oDoc as Object
Dim oSheet1 As Object, oSheet2 As Object
Dim oRangeOrg As Object, oRangeOrgAdr As Object, oCellCpy As Object
Dim nLastRow As Long
nLastRow = Präfix „n“, weil bei Definition handelt es sich um eine Integer- oder Long-Variable
Wenn Du Dich mit der Thematik des Programmierens auseinandersetzen möchtest, kann
ich Dir folgende Seiten und Dokus zur Basic-Programmierung empfehlen.
https://www.uni-due.de/~abi070/count.ph ... eutsch.pdf
www.pitonyak.org
http://www.starbasicfaq.de/index.html
Libreoffice Handbücher.
Ganz unten auf der Seite befindet sich auch ein Handbuch zur Makro-Programmierung.
https://de.libreoffice.org/get-help/documentation/
Um dies noch zu erwähnen:
Man kann zur Programmierung unter Aoo und LO auch die Sprachen C++, Java, Python benutzen.
Hiernoch ein Buch von Oracle, ist zwar schon ein wenig betagt, aber hilfreich:
https://docs.oracle.com/cd/E19064-01/so ... 7-3924.pdf
Beispieldatei mit Makro:
Statt die Copy-Methode zu verwenden wäre es auch möglich nur die Werte, in einen
anderen Zellbereich zu schreiben. Formatierungen gehen dabei allerdings verloren.
Methode = getDataArray