Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Excel-Access Import

Betrifft: Excel-Access Import von: Melissa
Geschrieben am: 12.09.2014 12:24:32

Hallo zusammen,

ich hatte vor wenigen Wochen schon mal einen Beitrag geschrieben bezüglich einer Webabfrage und eines Imports mit Excel/VBA/Access. Da bräuchte ich beim Import nochmal Hilfe.

Folgendes Szenario:

Ich habe eine Excel-Liste mit folgenden Feldern:
BL_ISBN - BL_Hyperlink - BL_Titel - BL_Autor - BL_Datum - BL_PreisNeu - BL_PreisGebraucht - BL_Link

Beim ersten mal wird die Datei über Externe Daten - Excelimport in Access importiert. Dabei wird das Feld Hyperlink nicht mit importiert (es wird in Access nicht gebraucht, ist aber in der Excelliste wichtig). Beim Import gibt man an einen neuen PS von Access hinzuzufügen (dieser wird dann nachher von ID in BL_ID umbenannt). Der Import wird übrigens gespeichert.

Anschließend hat man die fertige Tabelle in Access, soweit ist auch alles gut.
Jetzt soll es ein Formular geben mit einem Button. Wenn man auf den Button klickt, soll der gespeicherte Excelimport von vorher wiederholt werden (sprich wenn man in der Excelliste einen Datensatz hinzugefügt hat, soll dieser in Access importiert werden)

Franz aus dem Forum hier hatte mir da schon einen Teil für den Import geschrieben:

Private Sub btn_Import_Click()
    If MsgBox("Daten für die Tabelle ""Buchliste"" jetzt importieren?", vbQuestion + vbOKCancel, _
 "Daten-Import") = vbOK Then
    Application.DoCmd.RunSavedImportExport "Buchverwaltung2014"
    Application.CurrentDb.TableDefs("tbl_Buchliste").Fields("BL_Link").OrdinalPosition = 9
    'Application.DoCmd.OpenForm FormName:="Buchliste_Formular", view:=acNormal
    End If
End Sub

Allerdings werden hier immer wieder alle Daten neu importiert und die ID wird nicht erkannt, sodass kein Import zustande kommt. :/

Könnte mir vielleicht jemand diesen Import so umschreiben, dass:

1. Nur neue Datensätze die in der Excelliste hinzugefügt wurden, importiert werden
2. Das die ID ausgelesen wird und es danach weitergeht (also Skript erkennt ID ist bei 8 und zählt dann automatisch hoch und fügt NUR den neuen Datensatz ein)
3. Fehlermeldung einbauen, falls etwas nicht geklappt hat

Um eine Lösung wäre ich super dankbar.

Gruß
Melissa

  

Betrifft: AW: Excel-Access Import von: fcs
Geschrieben am: 16.09.2014 16:05:57

Hallo Melissa,

wahrscheinlich muss man hier 2-stufig arbeiten:
1. per Import werden alle Daten in neue Tabelle geladen
2. Per Anfügeabfrage werden dann die neueren Datensätze aus Excel an die vorhandene Tabelle in ACCESS angefügt.

Ich muss allerding noch prüfen, ob das über die ID (die ja von Access automatisch verwaltet wird funktioniert oder ob noch irgendendwie eine Datum (+Uhrzeit?) in Excel mitverwaltte werden muss, damit man neuere Datensätze eindeutig identifizieren kann.

Sobald das Anhängen der neuen Daten komplett ist kann man die Importierte Tabelle wieder löschen.

Gruß
Franz


  

Betrifft: AW: Excel-Access Import von: Melissa
Geschrieben am: 18.09.2014 09:23:42

Guten Morgen,

Oke... Ja das einzige was ich bisher gefunden habe ist, dass man mit VBA auch Tabellen kopieren kann, sowie Beziehungen löschen und wieder neu setzen. Vielleicht könnte man es auch so machen:

Man hat die Haupttabellen die miteinander verknüpft sind und eine Temp-Tabelle. Der Import erfolgt in die Temp-Tabelle (komplett, also nicht nur die neuen Datensätze). Anschließend werden die Daten von der Temp-Tabelle in die Grundtabelle kopiert. Das ist zwar total umständlich, aber wäre zumindest eine Möglichkeit...

Gruß
Melissa


  

Betrifft: AW: Excel-Access Import von: Melissa
Geschrieben am: 18.09.2014 10:22:09

Hallo nochmal,

Habe es jetzt so gelöst:
Habe die Tabelle: tbl_Buchliste und die Tabelle tbl_BuchlisteTMP. In die TMP Tabelle wird das Excelfile importiert (komplett). Dann werden die Daten aus der TMP Tabelle in die anderen Tabelle kopiert.
Ist zwar wie gesagt etwas umständlicher, aber immerhin eine Lösung des Problems. Als Code hab ich folgendes:

Private Sub btn_Copy_Click()
CurrentDb.Execute "INSERT INTO tbl_Buchliste(BL_ID, BL_ISBN, BL_Titel, BL_Autor, BL_Datum)  _
SELECT ID, BL_ISBN, BL_Titel, BL_Autor, BL_Datum FROM tbl_BuchlisteTMP;"
End Sub

Private Sub btn_Import_Click()
    If MsgBox("Daten für die Tabelle ""Buchliste"" jetzt importieren?", vbQuestion + vbOKCancel, _
 "Daten-Import") = vbOK Then
    Application.DoCmd.RunSavedImportExport ("Test_Import")
    End If
End Sub

Jetzt bräuchte ich da nur noch eine Fehlerbehandlung drin. Also quasi ne Messagebox, wenn der Import geklappt oder nicht. Und eine Fehlerbehandlung, wenn die Tabelle kopiert wurde oder nicht.

Wenn du mir dabei noch helfen könntest wäre das klasse. :D


Gruß
Melissa


  

Betrifft: AW: Excel-Access Import von: fcs
Geschrieben am: 18.09.2014 14:15:30

Hallo Melissa,

das was du umgesetzt hast entspricht etwa der von mir vorgeschlagenen 2-stufigen Vorgehensweise beim Import der Daten.
Weiter automatisieren könnte man nur, wenn man Kriterien vorgeben könnte, welche Datensätze aus kompletten tmp-Liste jeweils in die Hauptliste kopiert werden sollen oder welche Datensätze in der tmp-Liste gelöscht werden sollen, bevor man das Kopieren ausführt.

Bezüglich Fehlermeldungen kann ich im Moment nur mal eine allgemeine Fehlerprüfung vorschlagen. Dadurch laufen die Makros zumindest durch ohne in den Debug-Modus zu fallen.
Eigentlich sollte Access ähnlich wie bei manueller Ausführung so eine Art Statusmeldung anzeigen, wenn beim Import etwas schief gegangen ist. Ich weiss aber nicht ob dem bei der Ausführung per Makro auch so ist.

Gruß
Franz

Private Sub btn_Copy_Click()
 On Error GoTo Fehler
 CurrentDb.Execute "INSERT INTO tbl_Buchliste(BL_ID, BL_ISBN, BL_Titel, BL_Autor, BL_Datum)" _
  & "SELECT ID, BL_ISBN, BL_Titel, BL_Autor, BL_Datum FROM tbl_BuchlisteTMP;"

Fehler:
  With Err
    Select Case .Number
      Case 0
        MsgBox "Daten ohne Fehler nach ""tbl_Buchliste"" kopiert", _
          vbOKOnly, "Neue Datensätze kopieren"
      Case Else
        MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description, _
          vbCritical + vbOKOnly, "Neue Datensätze kopieren"
    End Select
  End With
End Sub


Private Sub btn_Import_Click()
  On Error GoTo Fehler
    If MsgBox("Daten für die Tabelle ""Buchliste"" jetzt importieren?", _
        vbQuestion + vbOKCancel, "Daten-Import") = vbOK Then
      Application.DoCmd.RunSavedImportExport ("Test_Import")
    End If
Fehler:
  With Err
    Select Case .Number
      Case 0
        MsgBox "Daten ohne Fehler nach ""tbl_BuchlisteTMP"" importiert", _
          vbOKOnly, "Daten-Import"
      Case Else
        MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description, _
          vbCritical + vbOKOnly, "Daten-Import"
    End Select
  End With
End Sub



  

Betrifft: AW: Excel-Access Import von: Melissa
Geschrieben am: 18.09.2014 15:16:17

Hallo Franz,

super, dann lag meine Idee ja doch gar nicht so weit weg von dem was du auch geschrieben hattest.
Ich hab es jetzt nochmal so geändert, dass beim Insert erst geprüft wird, welche Daten schon vorhanden sind und diese dann nicht noch mal mit übernommen werden, sprich es werden nur die neuen Datensätze übernommen. Ich weiß zwar nicht ob es wirklich klappt, aber so sähe mein Code aus:
(Habe jetzt auf die Trennzeichen und Umbrüche verzichtet. Das ich das nachher im VBA Editor noch ändern muss, weiß ich)

CurrentDb.Execute "INSERT INTO tbl_Buchliste (BL_ID, BL_ISBN, BL_Titel, BL_Autor, BL_Datum)
SELECT ID, BL_ISBN, BL_Titel, BL_Autor, BL_Datum
FROM tbl_BuchlisteTMP
WHERE NOT EXISTS (SELECT BL_ID, BL_ISBN, BL_Titel, BL_Autor, BL_Datum
FROM tbl_Buchliste
WHERE tbl_Buchliste.BL_ID = tbl_BuchlisteTMP.ID
AND tbl_Buchliste.BL_ISBN = tbl_BuchlisteTMP.BL_ISBN
AND tbl_Buchliste.BL_Titel = tbl_BuchlisteTMP.BL_Titel
AND tbl_Buchliste.BL_Autor = tbl_BuchlisteTMP.BL_Autor
AND tbl_Buchliste.BL_Datum = tbl_BuchlisteTMP.BL_Datum)"
Wenn man jetzt allerdings einen Datensatz in dem Exceldokument löscht und dann wieder importiert, werden die Daten natürlich nicht übernommen, aber dafür wollte ich mir dann noch eine Updateroutine schreiben.

Es erscheint mir zwar auf den ersten Blick eine etwas umständlichere Methode, aber wenigstens komm ich so zu meinem gewünschten Ziel.


Ich weiß nicht inwiefern du dich mit dem Code auskennst, aber wenn der den ich oben noch geschrieben habe, soweit richtig ist, dann füge ich deinen und meinen zusammen und dann bin ich erstmal wieder zufrieden :D


 

Beiträge aus den Excel-Beispielen zum Thema "Excel-Access Import"