Office: [Access 2007] Datenimport csv-Datei

Helfe beim Thema [Access 2007] Datenimport csv-Datei in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo Leute. Mal sehen, ob es ein unlösbares Problem ist... In meiner Personalverwaltung will ich nun die geleisteten Stunden des Vormonats... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von ellinho, 11. Mai 2009.

  1. ellinho Erfahrener User

    [Access 2007] Datenimport csv-Datei


    Hallo Leute.

    Mal sehen, ob es ein unlösbares Problem ist...
    In meiner Personalverwaltung will ich nun die geleisteten Stunden des Vormonats importieren.
    Diese werden von einem anderen Programm aus exportiert.
    In dem Programm hat der Mitarbeiter die Möglichkeit, den Monat, der exportiert werden soll, auszuwählen.
    Dabei wird eine csv-Datei generiert, die immer einen anderen Namen hat (Zeitstempel) aber immer im gleichen Verzeichnis liegt. Diese sollte nach dem Importvorgang aus dem Ursprungsverzeichnis gelöscht werden.
    Die csv-Datei ist so aufgebaut : Personalnummer - Monat - Jahr - Summe der geleisteten Stunden.
    Nun möchte ich die Datensätze, bevor sie in die Tabelle "geleisteteStd" geschrieben werden, überprüfen und evtl. eine Meldung bringen, ob bestehende Datensätze überschrieben werden sollen.
    Das ist einmal für den 1.Fall : Der Kollege hat "vergessen", dass er die Daten bereits importiert hat. Für den 2.Fall : Der Kollege exportiert den falschen Monat. Für den 3.Fall : Es sind noch Daten nach dem 1.Importvorgang hinzugekommen und sollen wirklich die bestehenden Datensätze überschreiben. - Access sollte in allen Fällen die Meldung bringen "Datensätze für [Monat] [Jahr] schon vorhanden. Sollen diese überschrieben werden ?" Ja - Nein. Somit ist eine kleine Sicherheitsfunktion gegeben, dass keine doppelten Datensätze in die Tabelle "wandern".
    Wie kann man so etwas umsetzen ?
    Zusammenfassend : Über einen Button soll der Importvorgang eingeleitet werden, Überprüfung soll erfolgen, nach Import Datei aus Urprungsverzeichnis löschen.

    Mal sehen, ob es unlösbar ist. :roll:

    Gruß
    Karsten
     
    ellinho, 11. Mai 2009
    #1
  2. Exl121150 Erfahrener User
    Hallo Karsten,

    es spricht nichts gegen die Lösbarkeit des Problems; man kann sogar ein paar typische Verfahrensweisen hier veranschaulichen, wie man bei Fremddatenübernahme vorgehen sollte.

    1) Es gibt die access-externe Textdatei im csv-Format mit den Fremddaten: ihre Felder sind zeichengetrennt (;), ferner gibt es eine Kopfzeile mit den Feldbezeichnungen:
    Personalnummer;Monat;Jahr;Stunden
    1a) Diese Datei kann mittels Dateidialog ausgewählt werden (ein Vorgabeverzeichnis+Dateifilter kann voreingestellt werden).

    2a) Mittels einer noch festzulegenden Importspezifikation 'Datenimport_CSVImport' können die Daten aus 1) in eine temporäre (Zwischen)tabelle eingelesen werden.
    2b) Diese Zwischentabelle 'Temp_CSVImport' hat folgende Felder:
    Personalnummer (Zahl: Longinteger)
    Monat (Zahl: Integer)
    Jahr (Zahl: Integer)
    Stunden (Zahl: Single)

    2c) Da alle Sätze dieser Zwischentabelle die gleichen Einträge in den Feldern Monat+Jahr haben, genügt es, aus dem 1.Satz die Werte für Mont und Jahr zu ermitteln.

    2d) Die in 2a) erwähnte Importspezifikation kann jetzt wie folgt festgelegt werden:
    Multifunktionsleiste Tabulator 'Externe Daten', Gruppe 'Importieren', Button 'Textdatei'. Im Dialog 'Externe Daten - Textdatei' wählt man eine der vorliegenden Dateien aus 1) aus, wählt den Radiobutton 'Fügen Sie ... an Tabelle an:' aus, wählt dann aus der Combobox 'Temp_CSVImport' aus, 'Ok'-Schalter.
    Es erscheint der Textimport-Assistent mit einer Vorschau der CSV-Datei. Radiobutton 'Mit Trennzeichen...' auswählen, Button 'Weitere...' anklicken.
    Es erscheint die Datenimport-Importspezifikation: Radiobutton 'Trennzeichen' auswählen, Feldtrennzeichen ';' auswählen, Dezimalzeichen ',' auswählen. Ferner überprüfen, ob die Feldinformationen korrekt sind (mit Feldnamen, kein Überspringen).
    Button 'Speichern unter...' anklicken, Spezifikationsname: 'Datenimport_CSVImport' eingeben, 'OK'-Button.
    Nochmals 'Ok'-Button, um die Importspezifikation zu schließen.
    Im Textimport-Assistenten den 'Weiter >'-Button klicken: Radiobutton 'Semikolon' auswählen, Checkbox 'Erste Zeile enthält Feldnamen' anhaken, den 'Weiter >'-Button klicken.
    Im Textfeld 'Importieren in Tabelle' müsste bereits korrekt 'Temp_CSVImport' enthalten sein. Button 'Fertig stellen' anklicken.
    Im Dialog 'Externe Daten - Textdatei' den 'Schließen'-Button klicken (die Checkbox leer lassen).

    3a) Ferner gibt es eine endgültige Tabelle mit den Echtdaten namens 'TabAbrechnungen': Ihre Felder:
    ID (Autowert, Primärschlüssel)
    PersNr (Zahl: Dezimal 18,0)
    Monat (Zahl: Integer)
    Jahr (Zahl: Integer)
    Stunden (Zahl: Dezimal 18,2)


    4) Über die Tabelle aus 3a) wird eine Abfrage ausgeführt mit der Filterbedingung aus 2c).
    4a) Liefert diese Abfrage keine Sätze zurück, wurde für diesen Monat noch keine Datenübernahme durchgeführt -> kommentarlose Datenübernahme
    4b) Liefert diese Abfrage Sätze zurück, muss nachgefragt werden, ob eine Datenübernahme durchgeführt werden soll: falls ja, sind die Sätze mit dem gleichen Monat/Jahr aus der Tabelle 3a) zu entfernen (=überschreiben); falls nein, ist der Import abzubrechen.

    5) Im Falle der Datenübernahme in Tabelle 3a) muss eine Anfügeabfrage der Daten aus 2b) an die Daten aus 3a) durchgeführt ausgeführt werden.

    6) Zum Abschluss noch das VBA-Makro, das am besten in ein allgemeines Codemodul eingefügt werden kann. In das Codemodul für die entsprechende Formularklasse (in der Du Deinen Aufrufbutton hast), gibst Du in die Sub für das Button-Click-Ereignis den Programmaufruf 'CSV_Importieren' ein.
    Ferner solltest Du unbedingt den Pfad für die externe CSV-Datei an Deine Erfordernisse anpassen (gleich die 1. Zeile im folgenden VBA-Code: 'I:\Access\'); dahinter folgt der Dateifilter '*.csv' (der sollte vermutlich so belassen werden).
    Code:
    Const Suchpfad_CSV$ = "I:\Access\*.csv"
    Const Import_Spez_CSV$ = "Datenimport_CSVImport"
    Const Zwischentabelle$ = "Temp_CSVImport"
    Const Datentabelle$ = "TabAbrechnungen"
    
    Public Sub CSV_Importieren()
      Dim cdb As Database
      Dim DateiQ$
      Dim Monat%, Jahr%, Antwort%
      
    '------ Dateidialog zum Suchen und Selektieren der *.csv-Datei
      With Application.FileDialog(DialogType:=msoFileDialogOpen)
        .AllowMultiSelect = False
        .FilterIndex = 17
        .InitialFileName = Suchpfad_CSV$
        .InitialView = msoFileDialogViewDetails
        If .Show Then DateiQ$ = .SelectedItems(1)
      End With
      'falls im Dateidialog auf 'Abbrechen' geklickt wurde, beenden des Importes.
      If DateiQ$ = "" Then Exit Sub
    '------
      'Falls noch Datensätze in der Zwischentabelle 'Temp_CSVImport' enthalten sind, diese vorher löschen.
      DoCmd.RunSQL "DELETE * FROM " & Zwischentabelle$ & ";"
      
    '------
      'Datenimport aus der *.csv-Datei in die Zwischentabelle Temp_CSVImport:
      'dafür muss vorher die Importspezifikation 'Datenimport_CSVImport' erzeugt und gespeichert worden sein.
      DoCmd.TransferText TransferType:=acImportDelim, SpecificationName:=Import_Spez_CSV$, _
            TableName:=Zwischentabelle$, FileName:=DateiQ$, HasFieldNames:=True
    '------
      On Error Resume Next
      Set cdb = CurrentDb
      
    ' Ermitteln von Monat und Jahr aus dem 1.Satz der Zwischentabelle
      With cdb.OpenRecordset(Zwischentabelle$, dbOpenTable)
        .MoveFirst
        Monat% = !Monat
        Jahr% = !Jahr
        .Close
      End With
    ' Überprüfen, ob in der Tabelle 'TabAbrechnungen' Sätze mit Monat und Jahr
    ' wie in der Zwischentabelle vorhanden sind
      With cdb.OpenRecordset("SELECT Monat, Jahr FROM " & Datentabelle$ & _
                            " WHERE Monat=" & Monat% & " AND Jahr=" & Jahr% & ";", dbOpenDynaset)
        .MoveFirst
        If .EOF Then
          'Keine Sätze für Monat/Jahr in TabAbrechnungen vorhanden
        Else
          'Es sind Sätze für Monat/Jahr in TabAbrechnungen vorhanden
          Antwort = MsgBox("Es sind Datensätze für " & Monat% & "/" & Jahr% & " vorhanden." & vbCrLf & _
                           "Sollen diese überschrieben werden?", vbExclamation + vbOKCancel, "Vorhandene Sätze")
          If Antwort = vbOK Then
            'Vorhandene Datensätze löschen (=überschreiben)
            Do Until .EOF
              .Delete
              .MoveNext
            Loop
            .Close
          Else
            'Vorhandene Datensätze nicht überschreiben -> Abbruch
            .Close
            Exit Sub
          End If
        End If
      End With
      'Datensätze der Zwischentabelle 'Temp_CSVImport' anfügen an Tabelle 'TabAbrechnungen'
      DoCmd.RunSQL "INSERT INTO " & Datentabelle$ & " (PersNr, Monat, Jahr, Stunden) " & _
                   "SELECT PersonalNummer, Monat, Jahr, Stunden FROM " & Zwischentabelle$ & ";"
    End Sub
     
    Exl121150, 24. Mai 2009
    #2
  3. ellinho Erfahrener User
    Hallo Exl121150 !

    Danke erstmal für die umfangreiche Antwort.
    Ich habe alles mal so durchgeführt, wie von Dir beschrieben.
    Tabelle Temp_CSVImport erstellt, Tabelle TabAbrechnungen erstellt,
    die Importspezifikationen definiert und gespeichert und den VBA-Code in ein Modul namens csvImport eingefügt.
    Habe momentan zum Testen den Button einfach mal in ein noch leeres Formular eingefügt und folgenden Befehl mitgegeben :

    Private Sub Befehl0_Click()
    DoCmd.RunCommand CSV_Importieren
    End Sub

    Beim Klicken tut sich aber nichts.
    Was mache ich falsch ?

    Gruß
    Karsten
     
    ellinho, 27. Mai 2009
    #3
  4. ellinho Erfahrener User

    [Access 2007] Datenimport csv-Datei

    Hallo.

    Beim Debuggen kommt schon in der Zeile .....FileDialog..... Fehler beim Kompilieren.

    '------ Dateidialog zum Suchen und Selektieren der *.csv-Datei
    With Application.FileDialog(DialogType:=msoFileDialogOpen)


    Stimmt wohl mit dem Code etwas nicht.

    Gruß
    Karsten
     
    ellinho, 27. Mai 2009
    #4
  5. Exl121150 Erfahrener User
    Hallo Karsten,

    der Code an dieser Stelle ist sicher ok. Es gibt aber ein anderes Problem, auf das hinzuweisen ich leider vergessen habe:
    Wenn Du bitte in den VBA-Editor gehst (Alt+F11), im Menü des VBA-Editors 'Extras > Verweise...' auswählst, dann siehst Du die Liste der 'Verfügbaren Verweise':
    Dort müssen mindestens folgende 4 Einträge zu oberst, mit einem Häkchen versehen, stehen:
    - Visual Basic For Applications
    - Microsoft Access 12.0 Object Library
    - Microsoft Office 12.0 Object Library
    - Microsoft Office 12.0 Access database engine Object Library

    Falls einer dieser 4 Einträge zuoberst fehlt bzw. kein Häkchen aufweist, bitte in der Liste hinunter scrollen, den/die fehlenden Einträge suchen und mit einem Häkchen versehen.
    Diese 4 Verweise auf Objektbibliotheken müssen vorhanden sein, damit das Ganze ordnungsgemäß kompiliert und ausgeführt werden kann.
    Wie gesagt, es kommt nicht auf die Reihenfolge der Einträge in dieser Liste an, sondern nur auf die gesetzten Häkchen. Danach auf 'OK' klicken.

    Das war's, was noch gefehlt hat.
     
    Exl121150, 28. Mai 2009
    #5
  6. ellinho Erfahrener User
    @Exl121150

    Danke. Du bist ein Held.
    Es hatte der Haken bei Microsoft Office 12.0 Object Library gefehlt.
    Läuft auch alles prima. Eine Frage hätte ich noch :
    Wie kann man in den Code einfügen, dass die csv-Datei nach Abarbeitung aus dem Verzeichnis gelöscht wird ?

    Gruß
    Karsten
     
    ellinho, 28. Mai 2009
    #6
  7. Exl121150 Erfahrener User
    Hallo Karsten,

    dafür gibt es in BASIC eine Anweisung namens 'KILL' gefolgt vom Dateinamen (inkl. Pfad). In diesem Fall müsste das Ganze lauten:
    Kill DateiQ$
    und ist am besten nach dem Import der *.csv-Datei in die Zwischentabelle einzufügen, also nach DoCmd.TransferText ....
    Im Folgenden habe ich Dir nochmals den Ausschnitt aus dem VBA-Code wiedergegeben und den einzufügenden VBA-Code blau eingefärbt (samt Kommentarzeile):

    ............
    ............
    'Datenimport aus der *.csv-Datei in die Zwischentabelle Temp_CSVImport:
    'dafür muss vorher die Importspezifikation 'Datenimport_CSVImport' erzeugt und gespeichert worden sein.
    DoCmd.TransferText TransferType:=acImportDelim, SpecificationName:=Import_Spez_CSV$, _
    TableName:=Zwischentabelle$, FileName:=DateiQ$, HasFieldNames:=True
    'Nach dem Einlesen: Löschen der *.csv-Datei
    Kill DateiQ$

    '------
    On Error Resume Next
    Set cdb = CurrentDb
    .........
    .........
     
    Exl121150, 28. Mai 2009
    #7
  8. ellinho Erfahrener User

    [Access 2007] Datenimport csv-Datei

    @Exl121150

    Hallo.

    Prima. Hat einwandfrei geklappt. Du bist ein Genie.

    Danke.

    Gruß
    Karsten
     
    ellinho, 28. Mai 2009
    #8
  9. Ich finde diese Lösung sehr komfortabel und gut dokumentiert. Ein Verbessungsvorschlag habe ich. Ist es möglich den Pfad relativ anzugeben? statt: Const Suchpfad_CSV$ = "I:\Access\*.csv" so etwas wie Const Suchpfad_CSV$ = [CurrentProject].[path] & "*.csv"
     
    Rednaxela24, 9. Juli 2012
    #9
  10. Ich habe noch ein Frage: Wenn man die "On Error resume next" ausklammert, kommt der Laufzeitfehler 3021 " Kein aktueller Datensatz". Kann diese Fehelrmeldung durch einen VBA Code aufgefangen werden? M.a.W. Case 3021 ist der Auslöser für das Anfügen der Abfrage?
     
    Rednaxela24, 9. Juli 2012
    #10
  11. Ich war anscheinend mit meinem Lob zu schnell. 4b) löscht nur den ersten Datensatz (nur dieser wird ja überprüft). Alle anderen werden aus der temp Tabelle angefügt. Prinzipiell sollte man auch jeden Datensatz auf Vorhandensein überprüfen. Nocht destro trotz: Ausbaufähig ;-)
     
    Rednaxela24, 9. Juli 2012
    #11
  12. Exl121150 Erfahrener User
    Hallo,
    das ist natürlich möglich. Du musst nur aus der folgenden Zeile
    Const Suchpfad_CSV$ = "I:\Access\*.csv"
    2 Zeilen machen:
    Dim Suchpfad_CSV$
    Suchpfad_CSV$ = Application.Currentproject.Path & "\*.csv"


    Ist natürlich auch möglich:
    Das Statement "On Error Resume Next" bewirkt, dass bei einem auftretenden Fehler die momentan ausgeführte Anweisung abgebrochen wird und VBA mit der Ausführung der folgenden Anweisung ohne Unterbrechung fortfährt.
    Will man diese Fehlerbehandlung im Hintergrund ohne Information des Anwenders nicht, muss man ein paar Programmzeilen ändern:
    1) Ändern des Statements "On Error Resume Next" in "On Error GoTo Err_CSV_Import"
    2) Am Ende der Sub CSV_Importieren vor dem "End Sub" ist zB. Folgendes einzufügen:
    Code:
        '.....
        'Nach dem "DoCmd.RunSQL 'INSERT INTO.....' Folgendes einfügen:
        '.....
        Exit Sub
    Err_CSV_Import:
        If Err.Number=3021 then
            MsgBox Prompt:="FehlerNr="& Err.Number & ": " & Err.Description & vbCrLf & _
            "... weiterer spezieller Hinweistext ....", Title:="Fehlerhinweis", Buttons:=vbInformation+vbOKOnly
        End If
        Resume Next
    End Sub
    
     
    Exl121150, 28. Juli 2012
    #12
Thema:

[Access 2007] Datenimport csv-Datei

Die Seite wird geladen...
  1. [Access 2007] Datenimport csv-Datei - Similar Threads - Access 2007 Datenimport

  2. Access 2007 Datenbanken lassen sich nicht mehr öffnen

    in Microsoft Access Hilfe
    Access 2007 Datenbanken lassen sich nicht mehr öffnen: Hallo zuammen, das kumulative Update von Windows 10 jetzt im November hat auf meinen PC einen Fehler bei den Farben verursacht, der in verschiedenen Programmen auftrat. So auch bei meinen...
  3. PDF Datei aus ACCESS 2007 öffnen

    in Microsoft Access Hilfe
    PDF Datei aus ACCESS 2007 öffnen: Hallochen zusammen Möchte aus einem ACCESS Formular heraus eine PDF Datei öffnen. Reader ist auf jeden in Frage kommenden PC installiert. Wie gehe ich das am einfachsten an? Vielen Dank! 298456
  4. Grundlegende Informationen zu Makros in Access 2007

    in Microsoft Access Tutorials
    Grundlegende Informationen zu Makros in Access 2007: Grundlegende Informationen zu Makros in Access 2007 Access für Microsoft 365 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007...
  5. Access-2007-Datenbank in Access2013 weiterbenutzen???

    in Microsoft Access Hilfe
    Access-2007-Datenbank in Access2013 weiterbenutzen???: Wie kann ich eine replizierte Datenbank, die mit Access2007 erstellt wurde in Access2013 weiter benutzen oder vorher so konvertieren, dass genau dies möglich ist. Danke für die Unterstützung!
  6. Access 2007 Auswahl unter mehreren Tabellen

    in Microsoft Access Hilfe
    Access 2007 Auswahl unter mehreren Tabellen: Hi ich möchte bei meiner Datenbank eine Auswahl von mehreren Tabellen (Preislisten) erstellen und diese dann einer Person zuordnen. Leider bin ich in Access nicht so fit um dies umzusetzen. Am...
  7. Datan von Timeline aufsplitten - Access 2007/10

    in Microsoft Access Hilfe
    Datan von Timeline aufsplitten - Access 2007/10: Hallo zusammen, ich habe einige tausend records - deren Daten ich regelmäßig aufsplitten muss. Das heißt - ich habe ein Event XY das Startet am 01.10.2012 - endet am 21.10.2012 - und verbraucht...
  8. [Access 2007] zwei Tabellen - eine Abfrage dazu - wie?

    in Microsoft Access Hilfe
    [Access 2007] zwei Tabellen - eine Abfrage dazu - wie?: Hallo, seit langem mal wieder eine Frage von mir... Ich bekomme von freien Mitarbeitern Excel-Tabellen, die zwar gleich aufgebaut sind, aber unterschiedliche Datensätze enthalten. Da ich diese...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden