mikrocontroller.net

Forum: PC-Programmierung Excel VBA: Tabellen vergleichen Daten ergänzen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin

Ich arbeite gerade wieder an unsere Kontoverwaltung.

Der derzeitige Workflow sieht wie folgt aus:

CSV Datei mit den Buchungen von der Bank runterladen.
Diese über ein Excel öffnen
(Habe ein Makro geschrieben, welches die Einträge passend formatiert und 
in ein neues Tabellenblatt einfügt)
In das Tabellenblatt "Buchungen" wechseln und schauen, was der letzte 
bestehende Eintrag ist.
Zurück in das Tabellenblatt mit den importierten Daten, erste neue Zeile 
finden und von hier alle neuen Zeilen markieren, kopieren und in das 
Tabellenblatt an das Ende der bestehenden Tabelle einfügen.

Für diesen Ablauf würde ich gerne ein weiteres Makro schreiben.

Der Aufbau der Tabellen ist nicht gleich,
die Tabelle "Buchungen" enthält vor und hinter den einzufügenden 
Spalten, weitere Spalten.

Die Zeilen sind so eindeutig, wie Kontoauszüge halt so sind.
Es gibt immer wieder sie selben Zahlungspflichtigen und 
Verwendungszwecke.
Auch gibt es mehrere Buchungen an einem Tag.
Ein Filter der die letzte bestehende Zeile mit den neuen Daten 
vergleicht muss also mehr als eine Zelle vergleichen.

Und da hört mein Können auf und ich würde euch um einen Lösungsvorschlag 
mittels VBA bitten.

Danke und Gruß

Kolja

Autor: Sascha W. (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich würde folgendermaßen vorgehen:
* in der Buchungstabelle die letzte belegte Zeile finden ( 
sheet.usedrange.rows.count )
* die neue Tabelle zeilenweise von oben nach unten durchgehen und die 
notwendigen Spalten mit denen der letzen Zeile aus Buchungen vergleichen
* wurde die passende Zeile gefunden, alle nachfolgenden nach Buchungen 
kopieren

Sascha

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha W. schrieb:
> die neue Tabelle zeilenweise von oben nach unten durchgehen und die
> notwendigen Spalten mit denen der letzen Zeile aus Buchungen vergleichen

Danke, aber genau dafür finde ich keine Lösung.

Autor: Sascha W. (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kolja L. schrieb:
> Sascha W. schrieb:
>> die neue Tabelle zeilenweise von oben nach unten durchgehen und die
>> notwendigen Spalten mit denen der letzen Zeile aus Buchungen vergleichen
>
> Danke, aber genau dafür finde ich keine Lösung.
Ok mal so aus dem Kopf
set sh_bu=sheets("buchungen")
set sh_im=sheets("import")
last_bu=sh_bu.usedrange.rows.count
r=2
cp=0
while sh_im.cells(r,1)<>""
  If c0=0 then
     if sh_bu.cells(last_bu,1)=sh_im.cells(r,1) and sh_bu.cells(last_bu,2)=sh_im.cells(r,2) and ... then
        cp=1
  Else
     last_bu=last_bu+1
     For i=1 to n
       sh_bu.cells(last_bu,n)=sh_im.cells(r,n)
     Next
   Endif
   r=r+1
wend

Sascha

Autor: Kolja L. (kolja82)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe.
Lief nicht auf Anhieb,  jetzt aber schon.
Beispiel lade ich morgen hoch..

Autor: Kolja L. (kolja82)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen

Wie versprochen hier ein funktionierendes kleines Beispiel:
Sub Datei_Einlesen()

' Tabellenblätter zuordnen
Set Konto = Sheets("Konto")
Set einlesen = Sheets("Einlesen")

' letzte Zeile in der Tabelle Konto finden
last_Konto = Konto.UsedRange.Rows.Count

' Zeilenzähler definieren, beginnt in der 2. Zeile
r = 2
' Marker für "letzte Zeile gefunden"
cp = 0

' Schleife läuft Zeile für Zeile in der Tabelle "Einlesen" bis in der ersten Spalte keine Werte mehr enthalten sind
While einlesen.Cells(r, 1) <> ""

' Prüft, ob die letzte Zeile aus "Konto" in den Zellen 1 - 4 identisch ist mit den Zeilen in "Einlesen"
' Wenn das so ist -> letzte Zeile gefunden -> Marker = 1
  If cp = 0 Then
     If Konto.Cells(last_Konto, 1) = einlesen.Cells(r, 1) _
     And Konto.Cells(last_Konto, 2) = einlesen.Cells(r, 2) _
     And Konto.Cells(last_Konto, 3) = einlesen.Cells(r, 3) _
     And Konto.Cells(last_Konto, 4) = einlesen.Cells(r, 4) Then
        cp = 1
     End If

' Zeilennummer immer um 1 erhöhen
' und die Spalten 1 - 4 von "Einlsen" in "Konto" schreiben
  Else
     last_Konto = last_Konto + 1
     For i = 1 To 4
       Konto.Cells(last_Konto, i) = einlesen.Cells(r, i)
     Next
' in der 5. Spalte in "Konto" die Markierung "neu" einfügen
     Konto.Cells(last_Konto, 5) = "neu"
     Konto.Cells(last_Konto, 5).Font.ColorIndex = 3
  End If
  
' Zeilenzähler um 1 erhöhen
   r = r + 1
   
Wend

End Sub

Habe mal versucht viel zu erklären, ist aber ehr so laienhaft.

Danke nochmal für die Hilfestellung!

Gruß Kolja

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.