Hallo vier³,
Zunächst was den groben Ablauf betrifft:
Dieser Abschnitt ist mir heute etwas zu unverständlich.
Habe den Button auf Tabellenblatt Export_1 verlinkt mit Originalliste - Export - Module1 - (dann gabs 3 zur Auswahl: davon ErzeugeExportDaten).
Korrekt.
Das erzeugen einer Tabelle im Hintergrund, die dann als CSV gespeichert wird, das habe ich verstanden.
Gut.
Der Zwischenschritt in Export_2 zu kopieren ist trotzdem notwendig um die nicht genutzten Formeln loszuwerden, oder?
Nein, nicht unbedingt.
Denn das war um leere Datensätze zwischen den einzelnen Datensätzen rauszufiltern. Also nach dem Muster.
[Export1]
Müller ....
______(leere Zeile, kein Datensatz)
Meier ....
Schulze ....
______(leere Zeile, kein Datensatz)
Schmitt ....
[Export2]
Müller ....
Meier ....
Schulze ....
Schmitt ....
Da Du aber ja sagtest, das dies nicht vorkommt, kann das Makro gekürzt werden, was ich dir aber schon am
Fr, 31.07.2015 13:14 mitteilte.
Und in folge dessen kann das Makro gekürzt werden, was dann so aussieht.
Code: Alles auswählen
REM Variablen deklaration.
Dim oDok as Object
Dim oExport1 as Object, oExternExportCSV as Object, oExterneCSV as Object
Dim aExtDatArray()
Dim sErmittlungsBlatt as String, sDatenBereich as String
Dim myFPq(0) as New com.sun.star.beans.PropertyValue
Dim myProps(1) as New com.sun.star.beans.PropertyValue
'
'##############################################################################################################
'
Sub ErzeugeExportDaten
REM Tabellenblatt Variablennamen definition.
oDok = ThisComponent
oExport1 = oDok.getSheets().getByName("Export_1")
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Neue und leere Datei versteckt erstellen, die dann als CSV gespeichert wird.
'
myFPq(0).name = "Hidden"
myFPq(0).Value = True ' REM wenn man diese versteckte Datei sehen will, einfach True durch False ersetzen.
oExterneCSV = starDesktop.loadComponentfromURL("private:factory/scalc", "_blank", 0, myFPq())
oExternExportCSV = oExterneCSV.sheets(0)
'--------------------------------------------------------------------------------
' Die Daten vom Blatt *Export_1* in die neue, leere und versteckte Datei kopieren.
'
sErmittlungsBlatt = oExport1.name
Benutzter_Datenbereich REM Aufruf der Sub.
aExtDatArray = oExport1.getCellRangeByName( sDatenBereich ).getDataArray REM Datenbereich einlesen (kopieren).
oExternExportCSV.getCellRangeByName( sDatenBereich ).setDataArray(aExtDatArray) REM Datenbereich einfügen.
'--------------------------------------------------------------------------------
Externe_CSV_speichern REM Aufruf der Sub.
'--------------------------------------------------------------------------------
PRINT "F Ä D D I S C H ! ! ! "
End Sub
'
'##############################################################################################################
'
Sub Externe_CSV_speichern
sPfad = "file:///T:/DOW_Arbeit/Aktuelles/Matthias/Export_Makro/" REM Den Speicherpfad vorgeben
sCSVname = "EXPORTAKTUELL_" REM Das ist der Vorname der CSV-Datei. Der Nachname wird bei sCSVzusatz erstellt.
'--------------------------------------------------------------------------------
myProps(0).Name = "FilterName"
myProps(0).Value ="Text - txt - csv (StarCalc)"
myProps(1).Name="FilterOptions"
myProps(1).Value = "59,34,ANSI,1,,0,false,true,true,false"
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Wenn die Minuten kleiner 10 sind, wird noch eine 0 (Null) vorangestellt.
if Minute(Now) <10 then
sMinu = 0 & Minute(Now)
else
sMinu = Minute(Now)
end if
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Der sCSVzusatz besteht aus dem Datum, der Zeit und des Dateityps.
REM Datum: Tag, Monat und Jahr
Rem Zeit: Stunden, Minuten und Sekunden
Rem Dateityp: .csv
sCSVzusatz = Day( Now ) & "_" & Month(Now) & "_" & Year( Now ) & " " & Hour( Now ) & "-" & sMinu & "-" & Second( Now ) & ".csv"
sSpeicherString = sPfad & sCSVname & sCSVzusatz REM Nun wird der Vor- und Nachname der CSV zusammen geschrieben.
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' CSV-Datei speichern und schließen.
'
oExterneCSV.storeAsURL(sSpeicherString, myProps()) REM Die CSV wird gespeichert
oExterneCSV.close(True) REM Die CSV wird geschlossen.
End Sub
'
'##############################################################################################################
'
Sub Benutzter_Datenbereich
Rem Hier wird der benutzte Datenbereich eines Blattes ermittelt, und in der Stringvariable sDatenBereich zurückgegeben.
oSheet = ThisComponent.getSheets().getByName( sErmittlungsBlatt )
oCellCursor = oSheet.createCursor()
oCellCursor.GotoEndOfUsedArea(True)
sDatenBereich = REPLACE(oCellCursor.AbsoluteName, "$" & oSheet.Name & ".", "")
End Sub
Wenn ich das Programm richtig verstanden habe, wird Export_2 zunächst eimal komplett gelöscht und dann werden die Daten samt Überschriftzeile von Export_1 kopiert und eingefügt (muss also nicht schauen, dass Export_2, wenn ich die ods-Tabelle abspeichere, mit Überschriftzeile versehen ist?
Korrekt.
Und da das neue Makro (wie gezeigt) nicht mehr auf das Blatt *Export_2* zugreift, werden die Daten statt dorthin nun direkt in die externe CSV-Datei rüberkopiert.
Als ich versucht habe das Makro aufzunehmen, war bei dem Schritt "Inhalte einfügen" das Problem, das abhängig von den vorher gemachten Aktionen die Häkchen z.B. bei "Formeln" gesetzt oder nicht gesetzt waren, es also nicht klar war, ob wärend des Makros das Häkchen gesetzt oder rausgenommen wird. Das Problem besteht bei der Programmierung gar nicht, oder?
Teilweise Korrekt.
Bei dieser Art von kopieren mittels
getDataArray und
setDataArray trifft das zu. Und nur mit dieser Methode kann man zwischen zwei Dateien kopieren, aber auch innerhalb einer Datei.
Jedoch gibt es auch in der Programmierung auch verschiedene Methoden zum kopieren, wo auch Formeln oder Formate mit kopiert werden. Damit kann man aber nur innerhalb einer Datei kopieren.
Das nur als Kurzinfo, da dies auch ein extrem umfangreiches Thema ist.
Wärend des händischen abspeicherns als CSV-Datei mußte bei Zeichensatz stehen: "Westeuropa (Windows-1252/WinLatin)" (mit anderen Zeichensätzen, z. B. Unicode, wie ich ursprünglich dachte, streikt wieder der Import bei StarMoney, als Feldtrenner muss "Semikolon" gewählt werden (das muss gewählt werden, zu Beginn ist "Komma" angegeben); Textrenner: "; nur Häkchen bei "Zellinhalt wie angezeigt".
Stimmt das mit der programmierten Version überein?
Das kannst nur Du überprüfen ob StarMoney mit den vorgenommenen Einstellungen im Makro zurecht kommt. Aber so wie ich das hier sehe, müsste das schon passen.
Und jetzt noch mein Gesellenstück: würde gern die Datensätze mit IBAN und die mit KTO getrennt als CSV speichern und die CSV dementsprechend benennen. Würde dazu einen Button "IBAN" und einen "KTO" in Export_1 erstellen und ihnenb jeweils eigene Makros zuordnen, bei denen die Vornamen als jeweils Export_IBAN und Export_KTO festgelegt sind. Erfolgversprechend?
Erfolgversprechend? Warum nicht? Geht schon
Gruß
balu