Excel Makro für selektiven csv import

Hallo, liebe Gemeinde!

da mir schon öfter hier geholfen wurde, wende ich mich auch diesmal vertrauensvoll an euch :smile:

Ich möchte gerne in eine schon vorhandene Tabelle Daten aus einer csv-Datei anfügen, wobei Daten nicht doppelt übernommen werden sollen.
Hintergrund ist der, dass ich eine Art Haushaltsbuch in einer Excel-Tabelle führe und mir meine Kontoumsätze ca. 1x monatlich im csv-Format herunterlade. Ich muss dabei jedoch vorm Einfügen in meine Tabelle immer sehr genau aufpassen, dass ich keine Daten doppelt übernehme, weil sich manchmal die Buchungs-Zeiträume zwischen schon eingetragenen Werten mit denen der einzufügenden Werte überschneiden.

Ist es möglich z.B. mit VBA, dass Excel vor dem Einfügen der Daten der CSV-Datei eine Überprüfung auf schon vorhandene Einträge macht oder noch besser mittels vorheriger Eingabe eines Datums, sämtliche Einträge die vor diesem Datum liegen nicht aus der CSV-Datei übernimmt ??

Die Excel-Tabelle und die csv-Datei sind von der Struktur her im Prinzip identisch:

KtNr; Verwendungszweck; Buchungsdatum; Betrag;
12345678; blablablabla ; 01.01.2010; 1000,00;
usw.

Leider kenn ich mich mit VBA zu wenig aus, daher wäre ich sehr dankbar für jeden Hinweis!

Ich möchte gerne in eine schon vorhandene Tabelle Daten aus
einer csv-Datei anfügen, wobei Daten nicht doppelt übernommen
werden sollen.
Ist es möglich z.B. mit VBA, dass Excel vor dem Einfügen der
Daten der CSV-Datei eine Überprüfung auf schon vorhandene
Einträge macht

KtNr; Verwendungszweck; Buchungsdatum; Betrag;
12345678; blablablabla ; 01.01.2010; 1000,00;
Leider kenn ich mich mit VBA zu wenig aus, daher wäre ich sehr
dankbar für jeden Hinweis!

Hallo Dibi,

okay, hier ein kleiner Hinweis:

Option Explicit
'
Sub CsvEinlesen()
Dim wks As Worksheet, W As Integer, Dat, Zei1 As Long, Zei2 As Long
Dim Offen As Boolean, Datei As String
Const Dateipfad As String = "c:\test\buchhaltung.csv"
Datei = Mid(Dateipfad, InStrRev(Dateipfad, "\") + 1)
Set wks = ThisWorkbook.Worksheets("Tabelle1")
Zei1 = wks.Cells(Rows.Count, 3).End(xlUp).Row
Dat = wks.Cells(Zei1, 3).Value
For W = 1 To Workbooks.Count
 If Workbooks(W).Name = Datei Then
 Offen = True
 Exit For
 End If
Next W
If Offen = False Then Workbooks.Open Dateipfad
With Workbooks(Datei).Worksheets(1)
 For Zei2 = 2 To .Cells(.Rows.Count, 3).End(xlUp).Row
 If .Cells(Zei2, 3).Value \> Dat Then
 Zei1 = Zei1 + 1
 .Rows(Zei2).Copy Destination:=wks.Cells(Zei1, 1)
 End If
 Next Zei2
End With
Workbooks(Datei).Close Savechanges:=False
wks.Range(Cells(2, 4), Cells(Zei1, 4)).NumberFormat = "0.00"
End Sub

Gruß
Reinhard

Hi Dibi,

also, so ein Problem lässt ich ganz gut mit einem Dictionary-Object und einem Array, das die Daten speichert, lösen.

Ich hab ihr leider grad kein Excel auf dem PC hier, aber den Ablauf kann ich dir erklären.

Zunächst musst du dir überlegen, woran ein Datensatz eindeutigt erkannt werden kann. (Z. B. Buchungstag/-zeit in Verbindung mit Verwendungszweck oder vielleicht gibt es eine eindeutige Nummer je Buchungssatz…)

Dann legst du in VBA ein Dictionary und ein Array an. Das Arry muss sich dynamisch erweitern lassen (mit Redim Preserve).

Nun liest du als erstes die Daten ein, die schon importiert sind, also Zeilenweise dein Blatt durchlaufen. Dabei immer prüfen, ob der Eintrag schon vorhanden ist und wenn nicht, anhängen:

If not MeinDictionary.exists(EindeutigerWert) then
MeinDictionary.add (EindeutigerWert), laufendeNummer
Redim Preserve MeinArray (weiss ich momentan den Befehl nicht auswendig)
MeinArray(laufendeNummer,y) = „Verwendungszweck“
… (weitere Felder aus Datensatz ergänzen)
End if
(Wiederholen, bis alle Datensätze eingelesen sind)

Als nächstes die csv-Datei Öffnen und auch Zeilenweise durchlaufen. Zeile einlesen(Befehl Line Input) und die Zeile in die einzelnen Werte zerlegen (Befehl Split).

Auf diesem Weg die Daten in der csv-Datei auch in dein Dictionary und Array einlesen.

Als Ergebnis hast du ein Array, dass alle Daten enthält und sicher keine doppelten Datensätze.

Jetzt nur noch die bisherigen Daten aus deinem Excelblatt löschen und statt dessen die Werte aus dem Array ins Blatt schreiben. Fertig.

Wenn du das Array noch sortieren möchtest, bevor du es in dein Blatt schreibst müsstest du noch schnell einen Sortieralgorithmus (Bubble, Quicksort - einfach bei Google nachsuchen) einbauen.

Hoffe mal, das hift dir…