BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Tabbellen Name anstatt Nummer im Makro verwenden

Alles zur Programmierung im LibreOffice.
Antworten
Tschubi
Beiträge: 138
Registriert: Fr 13. Nov 2015, 12:09

Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von Tschubi » Di 16. Mai 2023, 12:09

Hallo zusammen,

ich habe mir mit dem Makro Recorder ein paar Abläufe aufgenommen, um diese zu automatisieren und folgendes Problem festgestellt.

Ich wähle eine bestimme Tabelle in meinem Sheet aus um einen Bereich zu kopieren und um diesen in einer anderen Tabelle wieder einzufügen.

Code: Alles auswählen

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 31

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$B$29:$Q$40"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Nr"
args4(0).Value = 32

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args4())
Jetzt habe ich jedoch das Problem das im Makro die jeweilige Tabelle als Nummer erfasst wird und nicht als Name.

Code: Alles auswählen

args1(0).Name = "Nr"
args1(0).Value = 31
Denn in meinem Sheet kommen immer wieder weitere Tabellen hinzu und somit stimmt die Nummer dann eben nicht mehr mit dem Tabellenblatt über ein aus welchem ich Daten kopiere und dem wohin ich es einfügen will.

Wie kann ich in dieser Prozedur anstatt der Nummer den Tabellen Namen übergeben um so immer eine korrekte Zuordnung zu gewährleisten?

Vielen Dank.
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von mikele » Di 16. Mai 2023, 22:50

Hallo,
mit dem Makrorekorder wirt du nicht weit kommen.
Arbeite dich in besser in die Nutzung der API ein.
Hier findest du viele nützliche Code-Schnipsel: https://www.dannenhoefer.de/faqstarbasic/index.html
Für deine Zwecke könnte es so losgehen:

Code: Alles auswählen

'Zugriff auf das Dokument
oDoc=ThisComponent
'Zugriff auf eine Tabelle
oTab=oDoc.Sheets.getByName("Tabelle1")
'Zugriff auf einen Zellebereich
oZellen=oTab.getCellRangeByName("$B$29:$Q$40")

Damit wirst du erheblich flexibler arbeiten können.
Gruß,
mikele

Tschubi
Beiträge: 138
Registriert: Fr 13. Nov 2015, 12:09

Re: Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von Tschubi » Mi 17. Mai 2023, 11:59

Hallo mikele,

schon mal vielen Dank. Schaue ich mir an.

VG
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

Tschubi
Beiträge: 138
Registriert: Fr 13. Nov 2015, 12:09

Re: Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von Tschubi » Mo 22. Mai 2023, 13:34

Hallo mikele,

ich habe aufbauend auf deinem Code und deinem Link https://www.dannenhoefer.de/faqstarbasic/index.html mal versucht das so zu erweitern, aber ich glaube, ich bin nicht ganz auf dem richtigen Weg, denn es funktioniert nicht.

Code: Alles auswählen

sub Daten_dublizieren

'Zugriff auf das Dokument
oDoc=ThisComponent
oView = oDoc.CurrentController
'Zugriff auf eine Tabelle Daten
oTabDaten=oDoc.Sheets.getByName("Daten")
'Zugriff auf eine Tabelle ScreenShots
oTabScreenShots=oDoc.Sheets.getByName("ScreenShots")

' Quellbereich
' Zugriff auf Zellbereich
oView.setActiveSheet(oTabDaten)
oQuelleRange=oTabDaten.getCellRangeByName("Daten_LOC1")
oQuellRangeAddresse = oQuelleRange.getRange

' Zielbereich
oView.setActiveSheet(oTabScreenShots)
oZiel = oTabScreenShots.getCellRangeByName("$C$4")
   oZielCellAdresse=oZiel.getCellAddress
   oTabScreenShots.copyRange(oZielCellAdresse,oQuellRangeAddresse)

end sub
Ohne VBA-Code Autovervollständigung ist es auch schwierig zu erkennen, ob der Syntax im Einzelnen passt.
Wie kann ich im VBA Editor den Code testen und auch die Inhalte der Variablen auslesen um so nachvollziehen zu können was die einzelnen Schritte bewirken?

Vielen Dank.
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

mikele
Beiträge: 1642
Registriert: Mo 1. Aug 2011, 20:51

Re: Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von mikele » Mo 22. Mai 2023, 20:25

Hallo,
zunächst VBA exisitiert so nur in Microsoft Office. In LO ist es zwar auch Basic, aber einige Sachen sind grundlegend anders.
Ein typischer Fall ist der Umgang mit Tabellen. Man kann in LO mit Tabellen arbeiten und Daten manipulieren ohne die jeweilige Tabelle zu aktivieren.
In deinem Fall:

Code: Alles auswählen

sub Daten_dublizieren

'Zugriff auf das Dokument
oDoc=ThisComponent

'oView = oDoc.CurrentController -> unnötig

'Zugriff auf eine Tabelle Daten
oTabDaten=oDoc.Sheets.getByName("Daten")
'Zugriff auf eine Tabelle ScreenShots
oTabScreenShots=oDoc.Sheets.getByName("ScreenShots")

' Quellbereich
' Zugriff auf Zellbereich
'oView.setActiveSheet(oTabDaten) -> unnötig
'.getCellRangeByName() hat als Argument einen Zellbereich, wie C1:D15
'um auf benannte Bereich zuzugreifen: 
oQuelleRange=oDoc.NamedRanges.getByName("Daten_LOC1") 'wenn der Bereich global definiert ist
'die Adresse ist ein Struct
oQuellRangeAddresse = oQuelleRange.ReferredCells.RangeAddress

' Zielbereich
'oView.setActiveSheet(oTabScreenShots)
oZiel = oTabScreenShots.getCellRangeByName("$C$4")
   oZielCellAdresse=oZiel.getCellAddress
   oTabScreenShots.copyRange(oZielCellAdresse,oQuellRangeAddresse)

end sub
Eine Codevervollständigung gibt es leider nicht.
Für die Analyse der Objekte und deren Eigenschaftenb etc. empfehle ich dir ein Inspektionstool (MRI oder XRAY).
Mehr Informationen findest du auch hier:
http://de.openoffice.info/viewtopic.php?t=1553
Gruß,
mikele

Tschubi
Beiträge: 138
Registriert: Fr 13. Nov 2015, 12:09

Re: Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von Tschubi » Di 23. Mai 2023, 11:11

Hallo mikele,

besten Dank und in meiner Testdatei funktioniert das so auch, siehe Anhang. Aber leider nicht in meiner Arbeitsdatei :-(
Da passiert gar nix und ich weiß nicht was vielleicht bis wohin funktioniert und was nicht.

Daher habe ich versucht mir mit Msgbox zwischendrin immer den Inhalt der Variablen auszugeben um so vielleicht nachvollziehen zu können was bis wohin funktioniert anhand dem zu erwartenden Inhalt der Variablen, aber hier bekomme ich immer Laufzeitfehler / Falscher Wert für Eigenschaft.

Code: Alles auswählen

MsgBox "Inhalt oQuelleRange: -" & oQuelleRange & "-"
MRI scheint ja nicht mehr in aktuellen LO zu funktionieren und XRAY konnte ich zwar hinzufügen aber da sehe ich nicht durch was wie zu machen ist :-(

Wie kann ich dem Problem auf die Spur kommen?

Vielen Dank!
Dateianhänge
Test_Copy_Paste.ods
(24.71 KiB) 75-mal heruntergeladen
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

Benutzeravatar
karolus
Beiträge: 2170
Registriert: Fr 10. Dez 2010, 10:01

Re: Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von karolus » Di 23. Mai 2023, 13:38

Hallo
Mri solltest du von hier runterladen

Basic kann nicht von sich aus irgendwelche Objektrepresentationen »msgbox«en, für die Text-representation musst du selber sorgen:

Code: Alles auswählen

MsgBox "Inhalt oQuelleRange: -" & oQuelleRange.ReferredCells.AbsoluteName & "-"
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.3.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Tschubi
Beiträge: 138
Registriert: Fr 13. Nov 2015, 12:09

Re: Tabbellen Name anstatt Nummer im Makro verwenden

Beitrag von Tschubi » Di 23. Mai 2023, 15:24

Hallo zusammen,

@karolus Danke MsgBox funktioniert

Wenn der Ziel Bereich in Tabelle ScreenShots "$C$4" leer ist dann funktioniert das Makro soweit, sprich es wird der Bereich "Daten_LOC1" aus der Tabelle Daten kopiert. Sobald aber bereits Daten im Ziel Bereich vorhanden sind funktioniert das nicht merh, sprich vorhanden Werte werden nicht überschrieben.

Es werden auch Formeln mit kopiert was nicht gewollt ist und daher die Frage wie kann ich vorhandene Daten überschreiben und nur Werte und Formate kopieren?

Vielen Dank.
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten