von Stephan » Di, 14.09.2021 18:05
Alternativ kann ich mir auch vorstellen [...]
Also eigentlich könnte der ganze Code ohne dieses dämliche Copy-Paste auskommen, was uns (komischerweise) aufhält, obwohl ich es ursprünglich genannt habe um die Dinge zu vereinfachen (das Copy-Paste übernimmt auch Formatierungen und ist deshalb quasi bequemer - besserer Code ist es hingegen nichht, weder bei VBA noch bei StarBasic).
Du kannst statt:
Code: Alles auswählen
Sub save_to_pdf
rem ----------------------------------------------------------------------
rem define variables
dim quelldatei
dim quell_ws
Dim quellframe
dim zielframe
dim zieldatei
dim ziel_ws
dim time as string
dim date as string
dim path as string
dim zieldateiurl as string
dim zieldateiprop() as new com.sun.star.beans.PropertyValue
dim zielzeile_int as long 'interne Zeilnnummer beginnt mit Zählung bei 0
dim zielzeile_ext as long 'externe Zeilennummer beginnt mit Zählung bei 1
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
quelldatei = ThisComponent
quellframe = ThisComponent.CurrentController.Frame
quell_ws = ThisComponent.CurrentController.ActiveSheet
path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
path = "file:///C:/Users/rig/Desktop/trash/Neu/"
zieldateiurl = path & "Daten.ods"
'Öffnen des Ziel-Dokumentes
zieldatei = StarDesktop.loadComponentFromURL(zieldateiurl, "_blank", 0, zieldateiprop())
zielframe = zieldatei.CurrentController.Frame
ziel_ws = zieldatei.Sheets.getByName("Daten")
'Zielzeile bestimmen
oCellCursor = ziel_ws.createCursor
oCellCursor.GotoEndOfUsedArea(False)
zielzeile_int = oCellCursor.getRangeAddress().endRow + 1
zielzeile_ext = zielzeile_int + 1
'Anzahl kopieren
dim args_quell_Anzahl(0) as new com.sun.star.beans.PropertyValue
args_quell_Anzahl(0).Name = "ToPoint"
args_quell_Anzahl(0).Value = "$B$6:$B$18"
dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args_quell_Anzahl())
dispatcher.executeDispatch(quellframe, ".uno:Copy", "", 0, Array())
zielzelle = ziel_ws.getCellByPosition(0, zielzeile_int)
zieldatei.CurrentController.Select(zielzelle)
dim args_ziel_Anzahl(0) as new com.sun.star.beans.PropertyValue
args_ziel_Anzahl(0).Name = "ToPoint"
args_ziel_Anzahl(0).Value = "$A$" & zielzeile_ext & ":$M$" & zielzeile_ext
dispatcher.executeDispatch(zielframe, ".uno:GoToCell", "", 0, args_ziel_Anzahl())
'Anzahl transponiert einfügen
dim args_ziel_anz(5) as new com.sun.star.beans.PropertyValue
args_ziel_anz(0).Name = "Flags"
args_ziel_anz(0).Value = "SVD"
args_ziel_anz(1).Name = "FormulaCommand"
args_ziel_anz(1).Value = 0
args_ziel_anz(2).Name = "SkipEmptyCells"
args_ziel_anz(2).Value = false
args_ziel_anz(3).Name = "Transpose"
args_ziel_anz(3).Value = true
args_ziel_anz(4).Name = "AsLink"
args_ziel_anz(4).Value = false
args_ziel_anz(5).Name = "MoveMode"
args_ziel_anz(5).Value = 4
dispatcher.executeDispatch(zielframe, ".uno:InsertContents", "", 0, args_ziel_anz())
'...
End Sub
auch verwenden:
Code: Alles auswählen
Sub save_to_pdf
rem ----------------------------------------------------------------------
rem define variables
dim quelldatei
dim quell_ws
Dim quellframe
dim zielframe
dim zieldatei
dim ziel_ws
dim time as string
dim date as string
dim path as string
dim zieldateiurl as string
dim zieldateiprop() as new com.sun.star.beans.PropertyValue
dim zielzeile_int as long 'interne Zeilnnummer beginnt mit Zählung bei 0
dim zielzeile_ext as long 'externe Zeilennummer beginnt mit Zählung bei 1
Dim daten
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
quelldatei = ThisComponent
quellframe = ThisComponent.CurrentController.Frame
quell_ws = ThisComponent.CurrentController.ActiveSheet
path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
path = "file:///C:/Users/rig/Desktop/trash/Neu/"
zieldateiurl = path & "Daten.ods"
'Öffnen des Ziel-Dokumentes
zieldatei = StarDesktop.loadComponentFromURL(zieldateiurl, "_blank", 0, zieldateiprop())
zielframe = zieldatei.CurrentController.Frame
ziel_ws = zieldatei.Sheets.getByName("Daten")
'Zielzeile bestimmen
oCellCursor = ziel_ws.createCursor
oCellCursor.GotoEndOfUsedArea(False)
zielzeile_int = oCellCursor.getRangeAddress().endRow + 1
zielzeile_ext = zielzeile_int + 1
'lesen
daten = quell_ws.getCellRangeByName("B6:B18").getDataArray()
'schreiben
For i = 0 To UBOUND(daten())
ziel_ws.getCellByPosition(i, zielzeile_int).Value = daten(i) (0)
Next i
'...
End Sub
Wahrscheinlich brauchst Du eine Erklärung für:
Code: Alles auswählen
daten = quell_ws.getCellRangeByName("B6:B18").getDataArray()
damit liest Du die DAten eines Bereiches (hier also B6:B18) in ein Array das so viele Zellen hat wie der Bereich Zeilen und in jeder Zelle wiederum ein Array mit sovielen Zellen wie der Bereich Spalten hat.
in:
Code: Alles auswählen
ziel_ws.getCellByPosition(i, zielzeile_int).Value = daten(i) (0)
entspricht "daten(i) (0)" dem Wert der i-ten Zeile und der ersten Spalte des ursrünglichen Datenbereiches. Bezpgen auf Dein Beispiel entspräche "daten(3) (0)" also dem Wer aus Zelle B9 und "daten(0) (0)" dem Wert aus B6.
man könnte auch schreiben (was ggf. anfänger-verständlicher wäre):
Code: Alles auswählen
For i = 0 To UBOUND(daten())
tmp_daten = daten(i)
ziel_ws.getCellByPosition(i, zielzeile_int).Value = tmp_daten(0)
Next i
Gruß
Stephan
[quote]Alternativ kann ich mir auch vorstellen [...][/quote]
Also eigentlich könnte der ganze Code ohne dieses dämliche Copy-Paste auskommen, was uns (komischerweise) aufhält, obwohl ich es ursprünglich genannt habe um die Dinge zu vereinfachen (das Copy-Paste übernimmt auch Formatierungen und ist deshalb quasi bequemer - besserer Code ist es hingegen nichht, weder bei VBA noch bei StarBasic).
Du kannst statt:
[code]Sub save_to_pdf
rem ----------------------------------------------------------------------
rem define variables
dim quelldatei
dim quell_ws
Dim quellframe
dim zielframe
dim zieldatei
dim ziel_ws
dim time as string
dim date as string
dim path as string
dim zieldateiurl as string
dim zieldateiprop() as new com.sun.star.beans.PropertyValue
dim zielzeile_int as long 'interne Zeilnnummer beginnt mit Zählung bei 0
dim zielzeile_ext as long 'externe Zeilennummer beginnt mit Zählung bei 1
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
quelldatei = ThisComponent
quellframe = ThisComponent.CurrentController.Frame
quell_ws = ThisComponent.CurrentController.ActiveSheet
path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
path = "file:///C:/Users/rig/Desktop/trash/Neu/"
zieldateiurl = path & "Daten.ods"
'Öffnen des Ziel-Dokumentes
zieldatei = StarDesktop.loadComponentFromURL(zieldateiurl, "_blank", 0, zieldateiprop())
zielframe = zieldatei.CurrentController.Frame
ziel_ws = zieldatei.Sheets.getByName("Daten")
'Zielzeile bestimmen
oCellCursor = ziel_ws.createCursor
oCellCursor.GotoEndOfUsedArea(False)
zielzeile_int = oCellCursor.getRangeAddress().endRow + 1
zielzeile_ext = zielzeile_int + 1
'Anzahl kopieren
dim args_quell_Anzahl(0) as new com.sun.star.beans.PropertyValue
args_quell_Anzahl(0).Name = "ToPoint"
args_quell_Anzahl(0).Value = "$B$6:$B$18"
dispatcher.executeDispatch(quellframe, ".uno:GoToCell", "", 0, args_quell_Anzahl())
dispatcher.executeDispatch(quellframe, ".uno:Copy", "", 0, Array())
zielzelle = ziel_ws.getCellByPosition(0, zielzeile_int)
zieldatei.CurrentController.Select(zielzelle)
dim args_ziel_Anzahl(0) as new com.sun.star.beans.PropertyValue
args_ziel_Anzahl(0).Name = "ToPoint"
args_ziel_Anzahl(0).Value = "$A$" & zielzeile_ext & ":$M$" & zielzeile_ext
dispatcher.executeDispatch(zielframe, ".uno:GoToCell", "", 0, args_ziel_Anzahl())
'Anzahl transponiert einfügen
dim args_ziel_anz(5) as new com.sun.star.beans.PropertyValue
args_ziel_anz(0).Name = "Flags"
args_ziel_anz(0).Value = "SVD"
args_ziel_anz(1).Name = "FormulaCommand"
args_ziel_anz(1).Value = 0
args_ziel_anz(2).Name = "SkipEmptyCells"
args_ziel_anz(2).Value = false
args_ziel_anz(3).Name = "Transpose"
args_ziel_anz(3).Value = true
args_ziel_anz(4).Name = "AsLink"
args_ziel_anz(4).Value = false
args_ziel_anz(5).Name = "MoveMode"
args_ziel_anz(5).Value = 4
dispatcher.executeDispatch(zielframe, ".uno:InsertContents", "", 0, args_ziel_anz())
'...
End Sub[/code]
auch verwenden:
[code]Sub save_to_pdf
rem ----------------------------------------------------------------------
rem define variables
dim quelldatei
dim quell_ws
Dim quellframe
dim zielframe
dim zieldatei
dim ziel_ws
dim time as string
dim date as string
dim path as string
dim zieldateiurl as string
dim zieldateiprop() as new com.sun.star.beans.PropertyValue
dim zielzeile_int as long 'interne Zeilnnummer beginnt mit Zählung bei 0
dim zielzeile_ext as long 'externe Zeilennummer beginnt mit Zählung bei 1
Dim daten
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
quelldatei = ThisComponent
quellframe = ThisComponent.CurrentController.Frame
quell_ws = ThisComponent.CurrentController.ActiveSheet
path = "file:///C:/Users/Public/source_docs/Z-Abschläge/Neu/"
path = "file:///C:/Users/rig/Desktop/trash/Neu/"
zieldateiurl = path & "Daten.ods"
'Öffnen des Ziel-Dokumentes
zieldatei = StarDesktop.loadComponentFromURL(zieldateiurl, "_blank", 0, zieldateiprop())
zielframe = zieldatei.CurrentController.Frame
ziel_ws = zieldatei.Sheets.getByName("Daten")
'Zielzeile bestimmen
oCellCursor = ziel_ws.createCursor
oCellCursor.GotoEndOfUsedArea(False)
zielzeile_int = oCellCursor.getRangeAddress().endRow + 1
zielzeile_ext = zielzeile_int + 1
'lesen
daten = quell_ws.getCellRangeByName("B6:B18").getDataArray()
'schreiben
For i = 0 To UBOUND(daten())
ziel_ws.getCellByPosition(i, zielzeile_int).Value = daten(i) (0)
Next i
'...
End Sub[/code]
Wahrscheinlich brauchst Du eine Erklärung für:
[code]daten = quell_ws.getCellRangeByName("B6:B18").getDataArray()[/code]
damit liest Du die DAten eines Bereiches (hier also B6:B18) in ein Array das so viele Zellen hat wie der Bereich Zeilen und in jeder Zelle wiederum ein Array mit sovielen Zellen wie der Bereich Spalten hat.
in:
[code]ziel_ws.getCellByPosition(i, zielzeile_int).Value = daten(i) (0)[/code]
entspricht "daten(i) (0)" dem Wert der i-ten Zeile und der ersten Spalte des ursrünglichen Datenbereiches. Bezpgen auf Dein Beispiel entspräche "daten(3) (0)" also dem Wer aus Zelle B9 und "daten(0) (0)" dem Wert aus B6.
man könnte auch schreiben (was ggf. anfänger-verständlicher wäre):
[code]
For i = 0 To UBOUND(daten())
tmp_daten = daten(i)
ziel_ws.getCellByPosition(i, zielzeile_int).Value = tmp_daten(0)
Next i[/code]
Gruß
Stephan