🙏 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. 🤗

[gelöst] Copy Paste Makro

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Antworten
Tschubi
Beiträge: 159
Registriert: Fr 13. Nov 2015, 12:09

[gelöst] Copy Paste Makro

Beitrag von Tschubi » Mo 14. Aug 2023, 13:21

Hallo zusammen,

ich möchte Daten von einer Website rauskopieren, diese in temporär in einen Zellbereich ("GLT_Temp_Input") einfügen, aus diesem Bereich einen Teilbereich ("GLT_TMP_Auslastung") markieren, Punkte durch Komma ersetzen, dann kopieren und im Zielbereich ("GLT_Value1") einfügen. Abschließend den Inhalt im temporären Zellbereich ("GLT_Temp_Input") wieder löschen.

Das Ganze habe ich mit dem Makrorecorder aufgenommen und alles bis auf die Funktion GLT_input_insert und ich kann nicht erkennen, warum dies nicht funktioniert.

Hatte das Ganze ja als ein Makro und somit einer Funktion aufgenommen und weil es nicht funktioniert hat, dann in einzelne Funktionen separiert. Aber auch ohne Erfolg. Weiß auch nicht, wie ich mich dem Problem nähern kann, um es zu erkennen :-(

Bitte um Unterstützung und gern auch Tipps zur Fehleranalyse und vielleicht auch Code Optimierung / Reduzierung.

Vielen Dank

Code: Alles auswählen

Sub GLT_input

rem führt die einzelnen Funktionen nacheinander aus
GLT_input_insert
MsgBox ("GLT_input_insert - done")

GLT_input_copy_paste
MsgBox ("GLT_input_copy_paste - done")

GLT_Input_clear
MsgBox ("GLT_input_clear - done")
MsgBox ("done")

End Sub


sub GLT_input_insert
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 = "ToPoint"
args1(0).Value = "GLT_Temp_Input"

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

rem 
rem fügt zuvor markierten, kopierten Inhalt aus der Zwischenablage in den Zellbereich "GLT_Temp_Input" ein

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

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "GLT_TMP_Auslastung"

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

rem sucht und ersetzt Punkt durch Komma im Bereich "GLT_TMP_Auslastung" -> Ist ein Teilbereich aus "GLT_Temp_Input"
rem ----------------------------------------------------------------------
dim args3(20) as new com.sun.star.beans.PropertyValue
args3(0).Name = "SearchItem.StyleFamily"
args3(0).Value = 2
args3(1).Name = "SearchItem.CellType"
args3(1).Value = 0
args3(2).Name = "SearchItem.RowDirection"
args3(2).Value = true
args3(3).Name = "SearchItem.AllTables"
args3(3).Value = false
args3(4).Name = "SearchItem.SearchFiltered"
args3(4).Value = false
args3(5).Name = "SearchItem.Backward"
args3(5).Value = false
args3(6).Name = "SearchItem.Pattern"
args3(6).Value = false
args3(7).Name = "SearchItem.Content"
args3(7).Value = false
args3(8).Name = "SearchItem.AsianOptions"
args3(8).Value = false
args3(9).Name = "SearchItem.AlgorithmType"
args3(9).Value = 0
args3(10).Name = "SearchItem.SearchFlags"
args3(10).Value = 71680
args3(11).Name = "SearchItem.SearchString"
args3(11).Value = "."
args3(12).Name = "SearchItem.ReplaceString"
args3(12).Value = ","
args3(13).Name = "SearchItem.Locale"
args3(13).Value = 255
args3(14).Name = "SearchItem.ChangedChars"
args3(14).Value = 2
args3(15).Name = "SearchItem.DeletedChars"
args3(15).Value = 2
args3(16).Name = "SearchItem.InsertedChars"
args3(16).Value = 2
args3(17).Name = "SearchItem.TransliterateFlags"
args3(17).Value = 1073743104
args3(18).Name = "SearchItem.Command"
args3(18).Value = 3
args3(19).Name = "SearchItem.SearchFormatted"
args3(19).Value = false
args3(20).Name = "SearchItem.AlgorithmType2"
args3(20).Value = 1

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args3())

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

dispatcher.executeDispatch(document, ".uno:SearchResultsDialog", "", 0, args4())

end sub


sub GLT_input_copy_paste

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


rem kopiert den Bereich "GLT_TMP_Auslastung" um dann den Inhalt mit der Voreinstellung "nur Werte" in "GLT_Value1" einzufügen  
rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "GLT_TMP_Auslastung"

dispatcher.executeDispatch(document1, ".uno:GoToCell", "", 0, args5())

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

rem ----------------------------------------------------------------------
dim args10(0) as new com.sun.star.beans.PropertyValue
args10(0).Name = "ToPoint"
args10(0).Value = "GLT_Value1"

dispatcher.executeDispatch(document1, ".uno:GoToCell", "", 0, args10())

rem ----------------------------------------------------------------------
dim args6(5) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Flags"
args6(0).Value = "SVD"
args6(1).Name = "FormulaCommand"
args6(1).Value = 0
args6(2).Name = "SkipEmptyCells"
args6(2).Value = false
args6(3).Name = "Transpose"
args6(3).Value = false
args6(4).Name = "AsLink"
args6(4).Value = false
args6(5).Name = "MoveMode"
args6(5).Value = 4

dispatcher.executeDispatch(document1, ".uno:InsertContents", "", 0, args6())

end Sub


sub GLT_input_clear
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 löscht den temp. Inhalt aus dem Bereich "GLT_Temp_Input" und springt zur Zelle "$M$216"
rem ----------------------------------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "ToPoint"
args7(0).Value = "GLT_Temp_Input"

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

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

rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "ToPoint"
args8(0).Value = "$M$216"

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

end sub
Zuletzt geändert von Tschubi am Mi 30. Aug 2023, 07:55, insgesamt 2-mal geändert.
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Copy Paste Makro

Beitrag von karolus » Mo 14. Aug 2023, 15:23

Hallo

Den Code haben wir ja jetzt, es fehlt nur noch das Dokument mit den drei benannten Bereichen (ansonsten kannst du daraus alle Daten löschen) und etwas kopierten Text aus $Webseite

Code: Alles auswählen

[ code ] hier einfügen[ /code ]
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

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

Re: Copy Paste Makro

Beitrag von Tschubi » Fr 18. Aug 2023, 11:28

Hallo Karolus,

ich habe das jetzt mal in einer neuen Tabelle / Dokument nach gebaut und jetzt werden zwar Inhalte kopiert und eingefügt aber nicht so wie gewollt :-(

Die Daten welche ich normaler Weise von einer Website in den Zwischenspreicher kopiere, habe ich jetzt hier mal im Bereich Datenpool erfasst. Das bedeutet ich markiere und kopiere den Bereich K25:P41 in den Zwischenspreicher und würde dann über die eingefügte Schaltfläche das Makro ausführen.

Auf der Website habe ich leider nicht die Möglichkeit nur die benötigten Daten zu kopieren und muss daher den gesamten Bereich kopieren um dies dann mittel Makro weiter zu verarbeiten.

Ablauf / Ziel des Makros
- Daten aus dem Zwischenspreicher in den Bereich "GLT_Temp_Input" kopieren und den Punk durch Komma ersetzen
- aus dem Bereich "GLT_Temp_Input" den Bereich "GLT_Temp_Auslastung" markieren und kopieren und in den Bereich "GLT_Value1" einfügen.

Vielen Dank und Grüße
Dateianhänge
Test.ods
(18.81 KiB) 89-mal heruntergeladen
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Copy Paste Makro

Beitrag von karolus » Fr 18. Aug 2023, 12:24

kopiere doch einfach mal deine Rohdaten aus der Webseite und füge sie hier zwischen Codetags (das ist Knopf mit </>) ein, dazu zeigst du noch wie das später im Calcdukument aussehen soll.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

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

Re: Copy Paste Makro

Beitrag von Tschubi » Fr 18. Aug 2023, 12:53

die Rohdaten sind leider sensible Daten und kann ich hier eben leider nicht zur Verfügung stellen :-(
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Copy Paste Makro

Beitrag von karolus » Fr 18. Aug 2023, 13:06

Tschubi hat geschrieben:
Fr 18. Aug 2023, 12:53
die Rohdaten sind leider sensible Daten und kann ich hier eben leider nicht zur Verfügung stellen :-(
Ein kleiner Ausschnitt mit anonymisierten Sensibelchens würde mglw. reichen?
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

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

Re: Copy Paste Makro

Beitrag von Tschubi » Mo 21. Aug 2023, 10:13

Hallo Karolus,

im Grunde geht es mir nur um die Verbrauchsdaten welche ich in so in diesem Format "195.1 kW" von der Website mit anderen Daten zusammen rauskopiere, in Calc einfüge, den Punkt durch ein Komma ersetze und dann in den Zielbereich "GLT_Value1" / "$Daten.$C$4:$D$20" meiner Tabelle "Daten" einfügen will.

Alle anderen Daten(im Zwischenspeicher) werden nicht benötigt.

VG
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Copy Paste Makro

Beitrag von karolus » Mo 21. Aug 2023, 16:44

Das folgende funktioniert hier (ohne Textimportdialog und ohne temporäre Bereiche für die Daten)
Vorher hab ich noch dem Zellbereich C4:C20 den Namen values gegeben,
weil dein gewünschter Zielbereich bezieht sich auf C4:D20 das passt schlecht mit den Daten.

Code: Alles auswählen

import re
from pyperclip import paste

kw_rex = re.compile(r'(\d+\.\d+) kW').findall

def insert_kw_values_from_clipboard(*_):
    data = kw_rex(paste())
    data = list(zip(map(float,data)))
    doc = XSCRIPTCONTEXT.getDocument()
    target = doc.NamedRanges["values"]
    target.ReferredCells.DataArray = data
Das ist python-code ggf möchtest du apso.oxt von dieser Seite installieren und benutzen.
Ausserdem das third-party-modul pyperclip zum Zugriff auf die Zwischenablage →→

Code: Alles auswählen

pip install pyperclip --user
Der reguläre Ausdruck ist leider sehr allgemein, ich kann halt nicht garantieren das der mit DEINEM tatsächlichen Datensalat aus der Zwischenablage funktioniert, dann hat der Zielbereich auch noch fixe Länge von 17 Zellen, das müsste man ggf. noch flexibel anpassen.
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

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

Re: Copy Paste Makro

Beitrag von Tschubi » Mi 23. Aug 2023, 08:23

Hallo karolus,

danke, werde ich mal testen.

VG
Ubuntu 22.04.2 LTS / Windows 11 / LO 7.3.7.2


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