zwei Jahre lang konnte ich mit dem Makro aus diesem thread
viewtopic.php?f=12&t=25465
die csv-Dateien meiner Bank importieren. Im Februar 2022 änderte die Bank
das Format der Dateien. Die Anpassung des Makros war relativ einfach.
Die Bank hat nun schon wieder eine Änderung gemacht und ich muss schon
wieder das Makro anpassen. Die Umlaute und das ß werden falsch dargestellt.
Öffne ich manuell die Datei werden die Umlaute und das ß richtig dargestellt.
Ich gehe davon aus, dass in der Zeile
Code: Alles auswählen
args(2).Value = "59,34,0,1,2/4/3/4,0,false,true,true"
Wo kann ich eine Beschreibung der Filteroptionen finden, meine Suche danach
war leider erfolglos.
Anbei ist eine csv-Beispieldatei mit zwei Zeilen in der sich ein Umlaut befindet.
Viele Grüße
ich Bins
Code: Alles auswählen
Sub CSV_Import()
'Kontodatei.ods als Objekt in Variable schreiben
oKontoDoc = ThisComponent
'Dateiauswahl-Dialog erzeugen
oFilePicker = createUnoService("com.sun.star.ui.dialogs.FilePicker")
oFilePicker.setMultiSelectionMode(False)
'Filter für die Dateiauswahl initialisieren
oFilePicker.appendFilter("Alle Dateien", "*.*")
oFilePicker.appendFilter("csv - Dateien", "*.csv")
'Filter für cvs-Dateien aktivieren
oFilePicker.setCurrentFilter("csv - Dateien")
'Dialog aufrufen und auswerten
if oFilePicker.execute()=1 then 'wenn nicht abgebrochen
'Auslesen der gewählten Datei
oFiles= oFilePicker.getFiles() 'url der datei
'Setzen der Importoptionen
sFileURL=oFiles(0)
Dim Args(2) as New com.sun.star.beans.PropertyValue
args(1).Name = "FilterName"
args(1).Value = "Text - txt - csv (StarCalc)"
args(2).Name = "FilterOptions"
args(2).Value = "59,34,0,1,2/4/3/4,0,false,true,true"
'Öffnen des Dokuments
oImportDoc = StarDesktop.loadComponentFromURL(sFileURL,"_blank", 0, Args())
end if
' Isoliert die Jahreszahl aus dem Dateinamen
varArbeitsblatt = Mid(oImportDoc.Title, 33, 4)
' Zugriff auf das 1. Tabellenblatt
oExtCSVBlatt = oImportDoc.Sheets(0)
' Erste Zeilen löschen: Index und Anzahl
' myrows=oExtCSVBlatt.getrows
' myrows.removebyindex(0,15)
' letzte Zelle des Bereiches
ocursor = oExtCSVBlatt.createCursor()
ocursor.gotoStart()
ocursor.gotoEndofUsedArea(false)
' index letzte Spalte des Bereichs
' varLetzteSpalte = ocursor.getRangeAddress.endColumn
' index letzte Zeile des Bereichs
varLetzteZeile = ocursor.getRangeAddress.endRow
' letzt drei Zeilen löschen
myrows.removebyindex(varLetzteZeile - 2,varLetzteZeile)
oExtCSVSpalte=oExtCSVBlatt.getColumns
' Zugriff auf das 1. Tabellenblatt
oSheet = oImportDoc.Sheets(0)
myColumn=oSheet.getColumns
'Quell- und Zielspalten für Verschiebung
aQuelle=array("E","M","N","I","B")
aZiel=array("D","E","F","H","L")
'Kopieren
for i=0 to ubound(aQuelle)
oQuelleRange=mycolumn.getByName(aQuelle(i))
oQuellRangeAddresse = oQuelleRange.getRangeAddress
oZiel = mycolumn.getByName(aZiel(i)).getCellByPosition(0,0)
oZielCellAdresse=oZiel.getCellAddress
oSheet.copyRange(oZielCellAdresse,oQuellRangeAddresse)
next
'Spalten leeren
' mycolumn.getByName("E").ClearContents(1023)
mycolumn.getByName("I").ClearContents(1023)
' Spalte BLZ und Währung löschen
myColumn.removeByIndex(13,1)
myColumn.removeByIndex(12,1)
myColumn.removeByIndex(1,1)
'neue Spaltenüberschriften
oSheet.getCellByPosition(1,0).string="Vorgang"
oSheet.getCellByPosition(2,0).string="Buchungstext"
oSheet.getCellByPosition(3,0).string="Betrag"
oSheet.getCellByPosition(4,0).string="S-H"
oSheet.getCellByPosition(5,0).string="IBAN/Kontonummer"
oSheet.getCellByPosition(6,0).string="BIC/BLZ"
oSheet.getCellByPosition(7,0).string="Saldo"
oSheet.getCellByPosition(8,0).string="Verwendungszweck"
' Spaltenüberschrift fett formatieren
oRange = oSheet.getCellRangeByName("A1:K1")
oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD
' Spaltenbreite optimieren
oSheet.Columns(0).OptimalWidth = True
oSheet.Columns(1).OptimalWidth = True
oSheet.Columns(2).OptimalWidth = True
oSheet.Columns(3).OptimalWidth = True
oSheet.Columns(4).OptimalWidth = True
oSheet.Columns(5).OptimalWidth = True
oSheet.Columns(6).OptimalWidth = True
oSheet.Columns(7).OptimalWidth = True
oSheet.Columns(8).Width = 4000
oSheet.Columns(9).OptimalWidth = True
' Reihenfolge vertauschen
oCellCursor = oSheet.createCursor
oCellCursor.GotoEndOfUsedArea(False)
oBereich=oSheet.getCellRangeByPosition(0,1,oCellCursor.getRangeAddress().endColumn,oCellCursor.getRangeAddress().endRow)
'Zellinhalt in Array lesen
aDaten()=oBereich.getDataArray
'Zeilen- und Spaltenanzahl merken
zeilen=ubound(aDaten())
spalten=ubound(aDaten(0))
'Zeilen vertauschen
for i=0 to zeilen/2
tmp=aDaten(zeilen-i)
aDaten(zeilen-i)=aDaten(i)
aDaten(i)=tmp
next
' ab hier stehen die aufbereiteten Daten zur Verfügung
' letzte nicht leere Zeile in der Kontodatei ermitteln
'------andere Variablenbezeichnung wählen, oSheet bleibt für die csv
oZiel = oKontoDoc.Sheets().getByName(varArbeitsblatt)
ocursor = oZiel.createCursor()
ocursor.gotoStart()
'------------------------------------------
' letzte Zelle des Bereiches
ocursor.gotoEndofUsedArea(false)
' letzte Zeile des Bereichs
varEinfuegezeile = ocursor.getRangeAddress.endRow + 3
' Bereich zum Einfügen festlegen
' Der Bereich muss dieselbe Größe haben, wie der Ursprungsbereich!
oZielBereich = oZiel.getCellRangeByPosition(3,varEinfuegezeile,3+spalten,varEinfuegezeile+zeilen)
' Test ob das Auswählen der Zelle korrekt war
' mycell.string = "Probe"
' die nächste Zeile fügt die gedrehten Daten in die csv-Datei ein
oZielBereich.setDataArray(aDaten)
' csv-Datei schließen
oImportDoc.close(false)
End Sub