Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

merkwürdiger Fehler

Begonnen von MartinHan, Dezember 11, 2024, 01:34:20

⏪ vorheriges - nächstes ⏩

MartinHan

Hi,

ich möchte aus Access heraus eine .CSV Datei in eine .xlsx Datei umwandeln.

Public Function change_csv_to_xlsx(csv_folder As String, csv_datei As String) As String

   
On Error GoTo myerror

Dim Xlapp As Excel.application
Dim xlbook As Excel.Workbook
Dim filename As String
Dim filenameold As String
Dim n As Integer

Set Xlapp = New Excel.application

On Error GoTo myerror
   
Xlapp.Visible = False

filenameold = csv_folder & csv_datei
   
Set xlbook = Xlapp.Workbooks.Open(filenameold)

n = Len(csv_datei) - 4

filename = csv_folder & Mid(csv_datei, 1, n) & ".xlsx"
         
xlbook.SaveAs filename:=filename

Xlapp.application.Quit
   
Set xlbook = Nothing
Set Xlapp = Nothing

change_csv_to_xlsx = Mid(csv_datei, 1, n) - 4 & ".xlsx"

MsgBox "xlsx- Datei erstellt", vbInformation, "Excel Aufruf"

myexit:
Exit Function

myerror:
MsgBox "Fehler bei Umwandeln von csv in xxlsx", vbCritical, "Umwandlungsfehler"
MsgBox Err.Description
change_csv_to_xlsx = " "
Resume myexit

End Function

Bei dem Befehl change_csv_to_xlsx steigt er aus mit der Fehlermeldung: Typen unverträglich.
Die .xlsx Datei wird zwar erzeugt, ist aber in Excel nicht aufrufbar, das Dateiformat passt nicht...

Danke für Hilfe!

Martin
Es gibt nichts gutes, außer, man tut es! EK

PhilS

#1
Zitat von: MartinHan am Dezember 11, 2024, 01:34:20filename = csv_folder & Mid(csv_datei, 1, n) & ".xlsx"
         
xlbook.SaveAs filename:=filename
Und du meinst, wenn du nur einen Dateinamen übergibst, der auf .xlsx endet, dann weiß Excel schon, dass du die Datei konvertieren willst?
Ich an deiner Stelle, würde da mal genau nachschauen, was dazu in der Dokumentation zu SaveAs steht.


PS: Hat nichts mit dem konkreten Problem zu tun, aber ....

Zitatchange_csv_to_xlsx = Mid(csv_datei, 1, n) - 4 & ".xlsx"
Ich halte es für eine schlechte Idee, diese Operation einmal für den Dateinamen und dann nochmal für den Rückgabewert auszuführen. - Selbst jetzt ist der Code an beiden Stellen schon unterschiedlich.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy

Zitat von: MartinHan am Dezember 11, 2024, 01:34:20Mid(csv_datei, 1, n) - 4 & ".xlsx"


Mid erzeugt einen Text.

Nehmen wir mal an Mid liefert MartinHan. Das wäre dann also:
ZitatMartinHan - 4  & ".xlsx"

Also nix mit merkwürdig.



Knobbi38

#3
Hallo Martin,

CSV Dateien sollten nicht mit Excel geöffnet, sondern nur importiert werden, z.B. mit einem QueryTable Objekt. Die notwendigen Schritte dazu kannst du mit dem Makrorecorder in Excel aufzeichnen und dann analog in Access für die Automation übernehmen.

Gruß
Knobbi38

Nachtrag:
Alternativ bietet sich auch noch Workbooks.OpenText() für das Einlesen einer CSV Datei an.

MartinHan

Hi,

irgendwie habe ich da noch einen Hänger.

Hier ist der Output des Mackrorecorders in Excel

    Workbooks.Open Filename:= _
        "C:\DbAdcDevelopment\ExcelImport\20241207-27235-umsatz.CSV"
    ChDir "C:\DbAdcDevelopment\ExcelImport"
    ActiveWorkbook.SaveAs Filename:= _
        "C:\DbAdcDevelopment\ExcelImport\20241207-27235-umsatz.xlsx", FileFormat:= _
        xlOpenXMLWorkbook, CreateBackup:=False
    ActiveWorkbook.Close

Das Ergebnis ist ok, ich sehe eine Excel-Datei mit den richtigen Daten.

Hier ist das jetzt zusammengedampfe Coding in Access

csvfile = "C:\DbAdcDevelopment\ExcelImport\20241207-27235-umsatz.CSV"
xlsxfile = "C:\DbAdcDevelopment\ExcelImport\20241207-27235-umsatz.xlsx"

Set Xlapp = New Excel.application
Xlapp.Visible = False
Set xlbook = Xlapp.Workbooks.Open(csvfile)
xlbook.SaveAs filename:=xlsxfile, FileFormat:=xlOpenXMLWorkbook
Xlapp.application.Quit
   
Set xlbook = Nothing
Set Xlapp = Nothing

Es wird zwar eine Excel Datei erstellt, aber die ist völlig strubbelig, die Auflösung auf die Spalten findet nicht statt.

Welches Häkchen habe ich übersehen?

Danke für Hilfe!

Martin


Es gibt nichts gutes, außer, man tut es! EK

Knobbi38

#5
Zitat von: MartinHan am Dezember 11, 2024, 23:39:55Welches Häkchen habe ich übersehen?
Wenn du Workbook.Open() verwendest, hast du offensichtlich meinen Beitrag (#3) nicht wahrgenommen oder schlichtweg ignoriert. Wie soll man die dann helfen?

Andere Frage:
Warum den Umweg über Excel, man könnte doch alles auch in Access machen?

MartinHan

Man sagt ja von Alexander von Humboldt, das er letzte gewesen war, der alles Wissen seiner Zeit auf sich vereinigen konnte.
In der EDV ist die Informationsmenge mittlerweile immens, keiner kann alles wissen.
Ich habe in diesem Zusammenhang zugegebenerweise Verständnisprobleme, und deshalb wende ich mich an das Forum, was mir immer sehr gut geholfen hat.
Ich verstehe nicht, warum im Macro workbooks.open Filename und in Access Xlapp.Workbooks.Open(csvfile) da ein Unterschied besteht.
Das hat nichts mit Ignoranz zu tun.

Martin
Es gibt nichts gutes, außer, man tut es! EK

MartinHan

Ziel ist, eine CAMT.csv-Datei von der Sparkasse auszuwerten.
Allerdings nicht alle Datensätze, sondern nur einen Teil.

Ich dachte mir, die csv Datei in Excel zu konvertieren und dann daraus eine Rohtabelle in Access zu füttern.
Aus dieser Tabelle filtere ich dann bestimmte Datensätze, die von Interesse sind.Ich habe es versucht mit

DoCmd.TransferText acImportDelim

aber das klappte nicht...

Mit transferspreadsheet, wenn ich vorher die CSV Datei manuell in Xlsx Konvertiert hatt, klapp es wunderbar. Ich wollte nur den Schritt der Transformation von csv nach xlsx automatisieren.

That's all

Kann doch nicht so schwierig sein...

Ich möchte nur einen Hinweis darauf haben, was an meinem Codung oben falsch ist, mehr nicht.

Martin
Es gibt nichts gutes, außer, man tut es! EK

MartinHan

Hallo,

nach einer Nacht Schlaf hat es nun geklappt...

Danke
Es gibt nichts gutes, außer, man tut es! EK

Knobbi38

Hallo,

wäre schön, wenn du uns auch an deiner Lösung teilhaben läßt.

Gruß
Knobbi38

MartinHan

Hi,

gerne-
Ich hatte ja geschrieben, das ich da mit dem
 
DoCmd.TransferText acImportDelim, "csvimport", "rohdaten", csv_folder & csv_datei, True

Nicht geklappt hat. ich hatte mir wohl den Spezifikationsassisten zerschossen und konnte den nicht nutzen. Ich habe dann Office repariert und schon klappte es. Ich lese die Daten in einem Rutsch in die Rohdaten und filter dann noch einige raus.

Jetzt läuft alles wie gewünscht. Allerdings muss ich noch genau schauen bei den exportierten Kontodaten gibt es wohl Unterschiede im Format. Das kriegt ich aber hin.

Bis dahin!

Martin
Es gibt nichts gutes, außer, man tut es! EK

Knobbi38

Danke für die Rückmeldung.  :)

MartinHan

Hi,

vielleicht noch das zur Fachlichkeit.
Die Software ist für eine Ballettschule. Am Anfang des Monats ziehen wir per Lastschrift Beiträge von den Kunden ein. Einige Kunden mögen keine Lastschrift (thy should go to hell...) und machen lieber monatlich manuell eine Überweisung.
Es ist also jeden Monat manuell zu prüfen ob

a) alle Lastschriften durchgegangen sind (die Gründe dafür wenn nicht sind vielfältig, aber nur ca. 1% der Fälle)
b) die Überweisungen getätigt wurden (wird schon mal vegessen)

Diesen unvermeidbaren manuellen Aufwand wollte ich optimieren.
Dazu habe ich einen Dialog geschaffen, der die Umsatzdaten der Bank einliest (die vorher im Onlinebanking exportiert wurden). Diese Daten, die in einer CSV Datei vorliegen, importiere ich in eine Access-Tabelle (Rohdaten).
Dann gehe ich die Datensätze durch und filtere die Daten raus, die nicht relevant sind.
Es bleiben dann nur die Daten in einer überschaubaren Menge über, die dann mit wenigen Klicks bearbeiten werden können.
Eine Zeitersparnis gegenüben dem alten, rein manuellen Verfahren um sicherlich 80%.

Technisch war mein Problem hier nur mit dem DoCmd.TransferText, weil ich damit nicht klar kam, versuchte ich dem Umweg über Excel...aber da hat sich jetzt erledigt.

Dieses war aber nur ein winziger Teil des Gesamtprojektes, der Umstellung der Datenhaltung von Access auf Sql-db, das läuft wunderbar.
Aber manchmal bleibt man an scheinbar kleinen Problemen hängen...vor allem, wenn man noch spät abends programmiert und meint noch fit zu sein! Ist man aber nicht!

Bis dahin!

Martin


Es gibt nichts gutes, außer, man tut es! EK