VBA Tipp: csv-Datei in neue Tabelle einlesen

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

  • Ich möchte den Inhalt einer csv-Datei in eine Access-Tabelle einlesen.
  • Die Tabelle wird automatisch erzeugt.
  • Die erste Zeile der csv-Datei muss die Excel-Spaltenüberschriften enthalten, die für die Access-Feldnamen verwendet werden.

Lösung

Das geht mit folgender Prozedur, die in einem globalen Modul hinterlegt wird:

Public Sub CsvDateiInTabelleEinlesen(Tabellenname As String, _
                                     Dateipfad As String)
 
   'Die erste Zeile der csv-Datei muss die Spaltenüberschriften enthalten.
   'Falls die Tabelle bereits existiert, wird sie gelöscht.
 
   'Die Datei muss vorhanden sein und eine gültige CSV-Datei darstellen
 
   'Der Tabellenname muss sich aus gültigen Zeichen zusammensetzen und
   'darf die Länge von 64 Zeichen nicht überschreiten.
   'Zu empfehlender Zeichenbereich für den Tabellenname: A-Za-z_0-9
 
   'Quelle: http://www.dbwiki.net/
 
   Dim db       As DAO.Database
   Dim rs       As DAO.Recordset
   Dim tdf      As DAO.TableDef
   Dim fld      As DAO.Field
   Dim fldName  As String
   Dim zeile    As Variant
   Dim arrWerte As Variant
   Dim dNum     As Integer
   Dim i        As Long
   Dim flag     As Boolean
 
   Set db = CurrentDb
 
   'Tabelle löschen, falls sie schon existiert
   On Error Resume Next
   db.TableDefs.Delete Tabellenname
   On Error GoTo 0
 
   'csv-Datei öffnen
   dNum = FreeFile()
   Open Dateipfad For Input As dNum
 
 
   flag = True  'zum Einlesen der Überschriften
 
   'Datei zeilenweise durchlaufen
   Do Until EOF(dNum)
 
      'Zeile auslesen, einzelne Werte in Array einlesen
      Line Input #dNum, zeile
      arrWerte = Split(zeile, ";")
 
      'Feldnamen aus der ersten Zeile (=Überschriften) auslesen
      If flag Then
         flag = False
 
         'Array durchlaufen
         For i = 0 To UBound(arrWerte)
 
            'Wenn kein Wert existiert
            If arrWerte(i) = vbNullString Then
               fldName = "Spalte_" & i + 1
            Else
               'Leerzeichen durch Unterstrich ersetzen
               fldName = Replace(arrWerte(i), " ", "_")
 
               'Ungültige Zeichen ersetzen
               fldName = Replace(fldName, Chr(10), "_")
               fldName = Replace(fldName, Chr(34), vbNullString)
               fldName = Replace(fldName, ".", "_")
               fldName = Replace(fldName, "!", vbNullString)
 
            End If
 
            'Spalte 1
            If i = 0 Then
 
               'TableDef-Objekt erstellen
               Set tdf = db.CreateTableDef(Tabellenname)
 
               ' Die neue Tabelle muß mindestens 1 Feld enthalten: Feld anlegen
               Set fld = tdf.CreateField(fldName, dbText, 255)
 
               ' Field-Objekt an Fields-Auflistung des TableDef-Objekts anfügen.
               tdf.Fields.Append fld
               tdf.Fields.Refresh
 
               ' TableDef-Objekt an TableDefs-Auflistung der Datenbank anfügen
               db.TableDefs.Append tdf
               db.TableDefs.Refresh
 
            Else
 
               'Fieldobjekt erzeugen
               Set fld = tdf.CreateField(fldName, dbText, 255)
 
               ' Field-Objekt an Fields-Auflistung des TableDef-Objekts anfügen.
               tdf.Fields.Append fld
               tdf.Fields.Refresh
 
               'Speicher freigeben
               Set fld = Nothing
 
            End If
 
         Next  'Feldname
 
         'Speicher freigeben
         Set tdf = Nothing
 
         'Daten über Recordset hinzufügen
         Set rs = CurrentDb.OpenRecordset(Tabellenname, dbOpenTable, dbAppendOnly)
 
      Else  'Werte in Tabelle einlesen
         rs.AddNew
 
         For i = 0 To UBound(arrWerte)
            rs(i) = IIf(arrWerte(i) = vbNullString, Null, Left$(Trim$(arrWerte(i)), 255))
         Next
 
         rs.Update
      End If
 
   Loop
 
   If Not rs Is Nothing Then rs.Close
   Close #dNum
 
End Sub

Aufruf

   Dim strTabellenname As String
   Dim strDateipfad As String
 
   strTabellenname = "Tabelle1"
   strDateipfad = CurrentProject.Path & "\Meine.csv"
 
   Call csvDateiInTabelleEinlesen(strTabellenname, strDateipfad)

Hinweise

  • Alle Tabellenfelder haben den Datentyp "Text" mit 255 Zeichen, d.h. die Feld-Datentypen und die Feldnamen müssen ggf. angepasst werden.
  • Texte, die länger als 255 Zeichen sind, werden abgeschnitten.


Wiki warning.png

Achtung: Falls die Tabelle bereits existiert, wird diese ohne Vorwarnung überschrieben!