🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

variablen bereich kopieren

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Antworten
Rolli
Beiträge: 9
Registriert: Do 13. Jul 2017, 08:04

variablen bereich kopieren

Beitrag von Rolli » Mi 30. Okt 2019, 10:53

Hallo Forum,
ich möchte gerne einen variablen bereich per makro kopieren.
ich schaffe es nicht den Code zu schreiben, dass es funktioniert. Der folgenden Code funktioniert für den Bereich ("A1:F25"). Hat jemand eine Idee wie man das machen kann?
Meine 2. Idee siehe unten funktioniert nicht. Es wird nichts kopiert und es gibt keine Fehlermeldung.

funktioniert:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub CopySpreadsheetRange
Dim oSheet1 As Variant, oSheet2 As Variant
Dim oRangeOrg As Variant, oCellCpy As Variant, lastRow As Long 

    oSheet1 = ThisComponent.Sheets.getByName("alle Termine")
    oSheet2 = ThisComponent.Sheets.getByName("test")
    oRangeOrg = oSheet1.getCellRangeByName("A1:F25").RangeAddress

    lastRow = GetLastUsedRow(oSheet2) + 3
    oCellCpy = oSheet2.getCellRangeByName("A" & lastRow).CellAddress

    oSheet1.CopyRange(oCellCpy, oRangeOrg)
    
End Sub

Function GetLastUsedRow(oSheet) As Long
Dim oCursor As Variant
    oCursor = oSheet.createCursor
    oCursor.GotoEndOfUsedArea(True)
    GetLastUsedRow = oCursor.RangeAddress.EndRow
End Function

funktioniert nicht:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub CopySpreadsheetRange
Dim oSheet1 As Variant, oSheet2 As Variant
Dim oRangeOrg As Variant, oCellCpy As Variant, lastRow As Long, lastRow2 As Long 

    oSheet1 = ThisComponent.Sheets.getByName("alle Termine")
    oSheet2 = ThisComponent.Sheets.getByName("test")
    lastRow = GetLastUsedRow(oSheet1) + 3
    
    oRangeOrg = oSheet1.getCellRangeByName("A" & lastRow).RangeAddress

    lastRow2 = GetLastUsedRow(oSheet2) + 3
    oCellCpy = oSheet2.getCellRangeByName("A" & lastRow2).CellAddress

    oSheet1.CopyRange(oCellCpy, oRangeOrg)
    
End Sub

Function GetLastUsedRow(oSheet) As Long
Dim oCursor As Variant
    oCursor = oSheet.createCursor
    oCursor.GotoEndOfUsedArea(True)
    GetLastUsedRow = oCursor.RangeAddress.EndRow
End Function

Mondblatt24
* LO-Experte *
Beiträge: 3345
Registriert: Fr 3. Mär 2017, 17:12

Re: variablen bereich kopieren

Beitrag von Mondblatt24 » Mi 30. Okt 2019, 11:52

Hallo,
ist das nicht ein Thema für LibreOffice Programmierung .

Gruß Peter
Win 11 (x64) ▪ LO 25.2.5.1 (x64) ▪ AOO Portable 4.1.15
Wenn Eure Frage zutreffend beantwortet wurde, seid so nett und fügt dem Betreff der Eingangsfrage [GELÖST] hinzu.

Rolli
Beiträge: 9
Registriert: Do 13. Jul 2017, 08:04

Re: variablen bereich kopieren

Beitrag von Rolli » Mi 30. Okt 2019, 12:44

sorry!
was soll ich jetzt machen?

Mondblatt24
* LO-Experte *
Beiträge: 3345
Registriert: Fr 3. Mär 2017, 17:12

Re: variablen bereich kopieren

Beitrag von Mondblatt24 » Mi 30. Okt 2019, 13:34

Hallo,
z.b. in LibreOffice Programmierung diese Frage noch einmal stellen und mit einem Link dorthin verweisen.

Gruß Peter
Win 11 (x64) ▪ LO 25.2.5.1 (x64) ▪ AOO Portable 4.1.15
Wenn Eure Frage zutreffend beantwortet wurde, seid so nett und fügt dem Betreff der Eingangsfrage [GELÖST] hinzu.

craig
* LO-Experte *
Beiträge: 1137
Registriert: Do 21. Apr 2016, 11:42

Re: variablen bereich kopieren

Beitrag von craig » Mi 30. Okt 2019, 17:25

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:
  1. 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.
  2. Lädt die Bibliothek „MRILib“, damit das Tool MRI ausführbar ist.
  3. Lädt die Bibliothek „XRAYTool“, damit das Tool XRAY ausführbar ist.
  4. 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?
  1. Die Farbe ROT ist eine Eigenschaft.
  2. 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
  3. Ein Klick-Event ist eine Methode.
Auch wenn man eine Objektvariable erstellen möchte, handelt es sich um eine Methode:

Code: Alles auswählen

Dim oDoc as Object
oDoc=ThisComponent
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:
Zelle Kopieren in letzte Zeile.ods
(19.63 KiB) 154-mal heruntergeladen
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
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.4.5.1 (x64) • AOO 4.1.8

Rolli
Beiträge: 9
Registriert: Do 13. Jul 2017, 08:04

Re: variablen bereich kopieren

Beitrag von Rolli » Mo 4. Nov 2019, 11:54

Hallo Craig,
erstmal vielen, vielen Dank für deine ausführlichen Erläuterungen. Zum einen bin ich fast platt, das du dir so viel Zeit für meine Frage genommen hast und gleichzeitig bin ich erstmal überfordert. Ich versuche das in den nächsten Tagen/ Wochen zu bearbeiten. Im Moment scheint mir meine Frage komplizierter zu sein als erwartet , aber vielleicht ist es gar nicht so...
Danke dir
Gruss Dominik


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten