Seite 1 von 1

[gelöst] Copy Paste Makro

Verfasst: Mo 14. Aug 2023, 13:21
von Tschubi
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

Re: Copy Paste Makro

Verfasst: Mo 14. Aug 2023, 15:23
von karolus
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 ]

Re: Copy Paste Makro

Verfasst: Fr 18. Aug 2023, 11:28
von Tschubi
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

Re: Copy Paste Makro

Verfasst: Fr 18. Aug 2023, 12:24
von karolus
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.

Re: Copy Paste Makro

Verfasst: Fr 18. Aug 2023, 12:53
von Tschubi
die Rohdaten sind leider sensible Daten und kann ich hier eben leider nicht zur Verfügung stellen :-(

Re: Copy Paste Makro

Verfasst: Fr 18. Aug 2023, 13:06
von karolus
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?

Re: Copy Paste Makro

Verfasst: Mo 21. Aug 2023, 10:13
von Tschubi
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

Re: Copy Paste Makro

Verfasst: Mo 21. Aug 2023, 16:44
von karolus
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.

Re: Copy Paste Makro

Verfasst: Mi 23. Aug 2023, 08:23
von Tschubi
Hallo karolus,

danke, werde ich mal testen.

VG