csv-Datei in vorhandene Exceldatei einlesen
#1
Hallo,

mir macht dieser Code:

Code:
Option Explicit
Public arHilf As Variant
Public fdDialog As FileDialog
Public i As Integer
Public j As Integer
Public objTextFile As Object
Public strDatei As String
Public strInhalt As String
Public varErgebnis As Variant

Sub CSV_Datei_einlesen()
    Set fdDialog = Application.FileDialog(msoFileDialogFilePicker)
    With fdDialog
        .Filters.Add "CSV-Dateien", "*.CSV", 1
        .Title = "Bitte Datei auswählen"
        .AllowMultiSelect = False
        If .Show = -1 Then
            strDatei = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strDatei, 1, False)
    strInhalt = objTextFile.ReadAll
    objTextFile.Close
    varErgebnis = Split(strInhalt, vbCrLf)
    ReDim arData(0 To UBound(varErgebnis), 0 To 15)
    For i = 0 To UBound(varErgebnis)
        arHilf = Split(varErgebnis(i), ";")
        If UBound(arHilf) = 15 Then
            For j = 0 To 15
                If IsNumeric(arHilf(j)) Then
                    arData(i, j) = CDbl(arHilf(j))
                Else
                    arData(i, j) = arHilf(j)
                End If
            Next
        End If
    Next
    Sheets("Konvert").Range("A1").Resize(UBound(arData) + 1, 15) = arData
End Sub

beim Einlesen vorhandener csv-Dateien in das Blatt("Konvert") der vorhandenen Exceldatei Probleme!
Die eine csv-Datei wird eingelesen und die andere nicht??!

Warum ist das so bzw. was ist an dem Code nicht ricchtig und muss anderes gemacht werden?

Als Anlage die Exceldatei, in die eingelesen werden soll: Erfassungsvorschlag.xlsm - alles nicht Relevante ist entfernt!
Weiterhin die csv.Dateien: csv Kontoauszug.csv - wird eingelesen
Kontoumsaetze_360_.....csv - wird nicht eingelesen

Wer kann mir helfen?


.xlsm   Erfassungsvorschlag.xlsm (Größe: 41,1 KB / Downloads: 4)
.csv   csv kontoauszug.csv (Größe: 3,12 KB / Downloads: 7)
.csv   Kontoumsaetze_360_210248101_20151124_182604.csv (Größe: 2,02 KB / Downloads: 6)
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Top
#2
Hallo Günter,

in der 2. Datei ist es eine Spalte mehr.

Ändere mal folgende 2 Codezeilen so ab (ist aber alles ungetestet).

Code:
ReDim arData(0 To UBound(varErgebnis), 0 To 16)

Code:
Sheets("Konvert").Range("A1").Resize(UBound(arData) + 1, 16) = arData
Gruß Stefan
Win 10 / Office 2016
Top
#3
Hallo Stefan,

leider auch nach dieser Änderung wird die Datei nicht eingelesen!
Du kannst es ja selbst ausprobieren, die entsprechenden Dateien sind ja in meinem Beitrag drin.

Ich muss nicht an dieser Routine "fest kleben", bin auch für jede andere Lösung dankbar, die folgendes abdeckt:
1. Anzeige der csv-Dateien zur Auswahl
2. Einlesen/Kopieren dieser csv-Datei in der das Tabellenblatt ("Konvert") in der bestehenden Erfassungs-Datei.

Die gepostete Routine habe ich in zwei anderen Projekten verwendet und dort gibt er keinerlei Probleme mit dem Einlesen der Daten, allerdings hatten die nur 2 Spalten und bestanden nur aus Zahlenwerten.
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Top
#4
Hallo Günter,

ich habe mir die Daten jetzt heruntergeladen und meinen Fehler bemerkt. Ich hatte zu wenig Zeilen geändert (wobei jetzt dann die andere Datei nicht mehr eingelesen werden kann).

Code:
Sub CSV_Datei_einlesen()
    Set fdDialog = Application.FileDialog(msoFileDialogFilePicker)
    With fdDialog
        .Filters.Add "CSV-Dateien", "*.CSV", 1
        .Title = "Bitte Datei auswählen"
        .AllowMultiSelect = False
        If .Show = -1 Then
            strDatei = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strDatei, 1, False)
    strInhalt = objTextFile.ReadAll
    objTextFile.Close
    varErgebnis = Split(strInhalt, vbCrLf)
    ReDim arData(0 To UBound(varErgebnis), 0 To 16)
    For i = 0 To UBound(varErgebnis)
        arHilf = Split(varErgebnis(i), ";")
        If UBound(arHilf) = 16 Then   'aus 15 wurde 16
            For j = 0 To 16 ' und auch hier ersetzt die 16 die 15
                If IsNumeric(arHilf(j)) Then
                    arData(i, j) = CDbl(arHilf(j))
                Else
                    arData(i, j) = arHilf(j)
                End If
            Next
        End If
    Next
    Sheets("Konvert").Range("A1").Resize(UBound(arData) + 1, 16) = arData
End Sub
Gruß Stefan
Win 10 / Office 2016
Top
#5
Hallo Stafan,

ja, jetzt kjlappt es mit der 2. Datei und nicht mehr mit der ersten - ich brauche aber eine variable Lösung, die beide Fälle abdeckt bzw. auch dann läuft, wenn es evtl. wieder Änderungen an den csv- Dateien läuft.
Kann man das nicht verallgemeinern? Autonom liest ha Excel anstandslos beide Dateien ein, nur mittels VBA klappt das nicht.
[Bild: attachment-190.gif]
Gruß Günter
aus der Helden-, Messe-, Musik-, Buch-, Universitäts- und Autostadt Leipzig
Top
#6
Hallo Günter,

versuche es mal damit

Code:
Sub CSV_Datei_einlesen()
    Dim lngSpalten As Long
    Dim strTeil As String
    Set fdDialog = Application.FileDialog(msoFileDialogFilePicker)
    With fdDialog
        .Filters.Add "CSV-Dateien", "*.CSV", 1
        .Title = "Bitte Datei auswählen"
        .AllowMultiSelect = False
        If .Show = -1 Then
            strDatei = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strDatei, 1, False)
    strInhalt = objTextFile.ReadAll
    strTeil = Left(strInhalt, InStr(strInhalt, vbCrLf))
    lngSpalten = Abs(Len(Replace(strTeil, ";", "")) - Len(strTeil))
    objTextFile.Close
    varErgebnis = Split(strInhalt, vbCrLf)
    ReDim arData(0 To UBound(varErgebnis), 0 To lngSpalten)
    For i = 0 To UBound(varErgebnis)
        arHilf = Split(varErgebnis(i), ";")
         For j = 0 To UBound(arHilf)
             If IsNumeric(arHilf(j)) Then
                 arData(i, j) = CDbl(arHilf(j))
             Else
                 arData(i, j) = arHilf(j)
             End If
         Next
    Next
    Sheets("Konvert").Range("A1").Resize(UBound(arData) + 1, UBound(arData, 2) + 1) = arData
End Sub
Gruß Stefan
Win 10 / Office 2016
Top
#7
Hallo Günter,

Steffl hat im code ein 2D-Array gefüllt. Wenn Du flexible Daten hast, die eine unterschiedliche Anzahl Zeilen und Spalten haben können, wäre es von Vorteil, beide Dimensionen variabel zu halten:
Sheets("Konvert").Range("A1").Resize(UBound(ardata, 1) + 1, UBound(ardata, 2) + 1) = ardata
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#8
Hallo Günter,

spaltenunabhängig:



' **************************************************************
' Modul: csv_Daten Typ = Allgemeines Modul
' **************************************************************


Option Explicit

Sub CSV_Datei_einlesen()
Dim arData As Variant
Dim arHilf As Variant
Dim fdDialog As FileDialog
Dim i As Integer
Dim j As Integer
Dim objTextFile As Object
Dim strDatei As String
Dim strInhalt As String
Dim varErgebnis As Variant

Set fdDialog = Application.FileDialog(msoFileDialogFilePicker)
With fdDialog
.Filters.Add "CSV-Dateien", "*.CSV", 1
.Title = "Bitte Datei auswählen"
.AllowMultiSelect = False
If .Show = -1 Then
strDatei = .SelectedItems(1)
Else
Exit Sub
End If
End With
Set objTextFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strDatei, 1, False)
strInhalt = objTextFile.ReadAll
objTextFile.Close
varErgebnis = Split(strInhalt, vbCrLf)
ReDim arData(0 To UBound(varErgebnis), 0 To UBound(Split(varErgebnis(0), ";")))
For i = 0 To UBound(varErgebnis)
arHilf = Split(varErgebnis(i), ";")
For j = 0 To UBound(arHilf)
If IsNumeric(arHilf(j)) Then
arData(i, j) = CDbl(arHilf(j))
Else
arData(i, j) = arHilf(j)
End If
Next
Next
Sheets("Konvert").UsedRange = ""
Sheets("Konvert").Range("A1").Resize(UBound(arData, 1) + 1, UBound(arData, 2) + 1) = arData
End Sub


Code eingefügt mit: Excel Code Jeanie

Gruß Uwe
Top
#9
Hallo André,

(26.11.2015, 21:03)schauan schrieb: Steffl hat im code ein 2D-Array gefüllt. Wenn Du flexible Daten hast, die eine unterschiedliche Anzahl Zeilen und Spalten haben können, wäre es von Vorteil, beide Dimensionen variabel zu halten:
Sheets("Konvert").Range("A1").Resize(UBound(ardata, 1) + 1, UBound(ardata, 2) + 1) = ardata

danke für deine Berichtigung, das hatte ich übersehen. :22:
Gruß Stefan
Win 10 / Office 2016
Top
#10
Oder:

Code:
Sub M_snb()
  With Application.FileDialog(3)
    .Filters.Add "CSV-Dateien", "*.CSV"
    .Title = "Bitte Datei auswählen"
    If .Show = -1 Then sn = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(.SelectedItems(1)).readall, vbCrLf)
  End With
  If IsEmpty(sn) Then Exit Sub
    
  Sheets("Konvert").Range("A1").Resize(UBound(sn) + 1) = Application.Transpose(sn)
  Sheets("Konvert").Range("A1").CurrentRegion.TextToColumns , , , , 0, 0, -1, 0, 0
End Sub
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste