Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1900to1904
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Werte durchsuchen und überprüfen mit VBA

Werte durchsuchen und überprüfen mit VBA
29.09.2022 18:08:53
ttheon
Guten Tag,
Ich versuche mir selber Excel VBA beizubringen und hänge seit einigen Tagen an diesem Problem und sehe leider keine Fortschritte. Unzwar habe ich drei verschiedene Registerkarten ("Name", "Adresse" & "Vergleich"). Diese haben jeweils alle eine Nummer in Spalte A. In der ersten Tabelle "Name" stehen in Spalte B Namen und in der zweiten Tabelle "Adresse" stehen in Spalte B die Adressen. Die Reihenfolgen sind alle verschieden. In der letzten Tabelle "Vergleich" sind die Nummern, Namen und Adressen, und mit Absicht sind zwei Adressen vertauscht.
Ich füge unten ein Bild zu den Tabellen hinzu.
Ich würde gerne anhand der Nummern die Namen und Adressen in der Tabelle "Vergleich" überprüfen und in der Spalte E diese dann ausgeben lassen, ob diese übereinstimmen oder nicht. Dafür werden die Nummern der Tabelle "Vergleich" in den anderen Tabellen durchsucht und wenn diese gefunden wurde, soll diese anschließend nach der Übereinstimmung der Namen und der Adressen überprüfen.
Eventuell auch, falls die Namen oder Adressen nicht übereinstimmen, dass diese angeben kann, welche von den nicht gleich ist und in einer weiteren Spalte angezeigt wird.
Das ist mein Code gerade:

Sub Test()
Dim i As Integer
Dim suchen As Range
For i = 2 To 11 'Wiederholen für nächsten 10 Zeilen
Set suchen = Cells(i, 1)
If Cells(i, 1) = Worksheets("Name").Cells(i, 1) = Worksheets("Vergleich").Cells(i, 1) Then
Range("E" & i).Interior.Color = vbGreen
Else: Range("E" & i).Interior.Color = vbRed
End If
Next i
End Sub
Ich wäre für jede Hilfe dankbar. :)
Vielen Dank!
Bild zu Tabellen: https://www.herber.de/bbs/user/155460.png

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Werte durchsuchen und überprüfen mit VBA
29.09.2022 23:13:59
Yal
Hallo Ttheon,
es nennt sich in dem Fall einen Join und wäre mir Power Query am besten zu erreichen.
Aber wer VBA lernen möchte, dem sollte geholfen werden.
Zuerst von Anfang an die richtige Gewohnheiten:
_ achte auf das Einrücken. Es ist grundlegend für die Lesbarkeit und die Erkennung von Fehler
_ keine Variable, die nicht verwendet werden ( wo wird "suchen" benutzt?)
Nun zum Code:
_ wenn zwei Listen durchgelaufen werden sollen, brauchst Du zwei Indexe: i und j. Dann zwei For-Schleifen. Zweimal 10 Werte miteinander vergleichen, ergibt 100 Vergleiche.
_ ein Vergleich erfolgt immer zwischen 2 Werte. Nie 3!

Sub Test()
Dim i As Integer
Dim j As Integer
For i = 2 To 11 'Wiederholen für nächsten 10 Zeilen
For j = 2 To 11
If Worksheets("Adresse").Cells(i, 1) = Worksheets("Name").Cells(j, 1) Then
Worksheets("Adresse").Range("E" & i).Interior.Color = vbGreen
Else
Worksheets("Adresse").Range("E" & i).Interior.Color = vbRed
End If
Next j
Next i
End Sub
Dieser Code funktioniert (wenn ich mich nicht vertippt habe, da ich am Handy bin), aber was macht er? Erstens, nichts nützliches, zweitens, die letzten Vergleiche überschreiben die vorigen.
Lese dieses Code laut und auf Deutsch. Ja laut. Hört sich zwischen komisch und bescheuert, aber so erfasst Du den Code an besten: Für eine Variable i, die zuerst den Wert zwei annimmt, nehme aus dem Blatt "Adresse" den Wert aus Zeile in Zeile i (also 2) und Spalte 1 und vergleiche... usw. Gleichzeitig in Schritt Modus (F8) laufen lassen und dabei lokale Fenster öffnen (Ansicht, Lokalfenster)
So wirst du am schnellsten den Code "spüren" und verstehen, warum er blöd ist. Und dementsprechend schnell herausfinden, was fehlt.
Viel Erfolg. Nur der Anfang ist schwer. Dran bleiben.
VG
Yal
Anzeige
AW: Werte durchsuchen und überprüfen mit VBA
30.09.2022 12:57:16
ttheon
Hey Yal,
Ich habe deine Tipps zu Herzen genommen und hoffentlich nun richtig angewendet. Ich habe mit deinem Code weitergearbeitet und bin zu diesem Ergebnis gekommen, was auch einwandfrei funktioniert hat. Ich musste es öfters laut aussprechen und so tun, als müsste ich es einer anderen Person erklären, was sehr gut geholfen hat.
Dies ist der fertige Code:

Sub Test()
Dim i As Integer
Dim j As Integer
Dim k As Integer
For i = 2 To 11 'Wiederholen für nächsten  10 Zeilen
For j = 2 To 11
For k = 2 To 11
If Worksheets("Vergleich").Cells(i, 1) = Worksheets("Name").Cells(j, 1) Then
If Worksheets("Vergleich").Cells(i, 2) = Worksheets("Name").Cells(j, 2) Then
If Worksheets("Vergleich").Cells(i, 1) = Worksheets("Adresse").Cells(k, 1) Then
If Worksheets("Vergleich").Cells(i, 3) = Worksheets("Adresse").Cells(k, 2) Then
Worksheets("Vergleich").Range("E" & i).Interior.Color = vbGreen
Else
Worksheets("Vergleich").Range("E" & i).Interior.Color = vbRed
End If
End If
End If
End If
Next k
Next j
Next i
End Sub
Weißt du eventuell, ob es möglich ist, falls die Werte nicht übereinstimmen, ob ich diese anzeigen lassen kann oder ist das zu weit gegriffen? Vielleicht in der Tabelle "Vergleich" in der Spalte F neben den Checks. Wenn ja, welchen Ansatz kann man da am besten anwenden?
Lieben Dank für deine schnelle Antwort und Hilfe!
Liebe Grüße
ttheon
Anzeige
AW: Werte durchsuchen und überprüfen mit VBA
01.10.2022 00:13:30
Yal
Hallo Ttheon,
Ja, sich selbst erklären ist vielleicht die beste Erklärung. Ein Coding komprimiert viele "Bedeutung" in sehr kurze Sequence. Diese komplett auszusprechen ist gut, um sie auseinander zu setzen und nicht etwas zu übersehen.
Ein kleiner Verbesserungsvorschlag:

Sub Test
Dim A As Worksheet
Dim N As Worksheet
Dim V As Worksheet
Dim i As Integer
Dim j As Integer
Dim k As Integer
Set A = Worksheets("Adresse")
Set N = Worksheets("Name")
Set V = Worksheets("Vergleich")
For i = 2 To 11 'Wiederholen für nächsten  10 Zeilen
For j = 2 To 11
For k = 2 To 11
If (V.Cells(i, 1) & V.Cells(i,2)) = (N.Cells(j, 1) & N.Cells(j, 2)) And (V.Cells(i, 1) & V.Cells(i,3)) = (A.Cells(k, 1) & N.Cells(k, 2)) Then
V.Range("E" & i).Interior.Color = vbGreen
Else
V.Range("E" & i).Interior.Color = vbRed
End If
Next k
Next j
Next i
End Sub
Dein Vergleich wäre aber mit Power Query "logischer", da es sich um einen Datenvergleich handelt. Aber es ist eine andere Sache, weil Du eigentlich VBA lernen möchte.
Etwas besser wäre der Einsatz von Objekt und Dictionary oder Collection. Ich bin leider nicht an einem Rechner mit Excel. Vielleicht habe ich morgen Zeit.
VG
Yal
Anzeige
Eine Version mit Power Query
01.10.2022 17:38:00
Yal
Hallo Ttheon,
wie Anke Engelke sagt: wer gackert, muss auch legen. Anbei eine Datei mit eine Verarbeitung mit Power Query.
Es hilft nicht direkt, VBA besser zu verstehen, weil es komplett ohne VBA funktioniert. Aber es setzt eine Verarbeitungsrezept, die man mit VBA nachimplementieren könnte (was reichlich absurd wäre, wenn das Ziel nur der beste -und vor allem schnellste- Ergebnis wäre)
Wie wird es gemacht:
_ die 3 Datenbereich werden in aktive Tabelle umgenwandelt: eine Zelle der Liste markieren, "Einfügen", "Tabelle", hat Überschrift: ja.
_ diese werden in tblName, tblAdresse und tblVergleich umbenannt (für die weitere Erklärung)
_ und je in Power Query angebunden. Dort sind dann 3 Queries "tblName", ...
(Queries anzeigen: Menü "Daten", "Abfrage anzeigen")
_ in Power Query Editor wird die Query tblVergleich markiert,
_ im Menü "Start", "Abfragen Anfügen", "Abfrage als neu anfügen"
_ Name in "Zusammenfassung" ändern
_ "Drei oder mehr Tabelle", man wählt die 3 Tabellen. Power Query erkennt die passende Überschriften.
_ alle andere Spalten als Nummer werden "entfernt"
_ auf dem Kopf von "Nummer", Rechtklicken und "Duplikate entfernen"
_ nun haben wir eine komplette und eindeutige Liste alle vorkommende Nummer
_ Menü "Start", "Abfrage zusammenführen"
_ Abfrage "tblVergleich" als zweite Abfrage auswählen, Join-Art "alle aus erste und passenden aus zweite" passt
_ in der neue Spalte, Klick auf dem doppelte auseinandergehende Pfeile, alles so annehmen
_ dito mit tblName und tblAdresse: Abfrage zusammenführen, Ergebnis erweitern.
_ Fertig? Nein: wir wollen die Gleichheit zwischen Vergleich.Name und Name.Name und zwischen Vergleich.Adresse und Adresse.Adresse einfügen (wenn schon denn schon)
_ Menü "Spalte hinzufügen", "Benutzerdefinierte Spalte", Spaltenname eingeben und if-then-else als Formel, einmal für Name, einmal für Adresse
_ Menü "Datei", "Schliessen & laden in...", "nur Verbindung" auswählen
_ wir sind zurück in Excel
_ auf der Abfrage "Zusammenfassung" rechtklicken, "Laden in..." anklicken, in einer "Tabelle" laden und Zielstelle auswählen
Jetzt richtig fertig.
Nun, was entnehmen wir für eine VBA-Verarbeitung?
_ alle Quellen durchgehen (Name, Adresse, Vergleich)
_ die eindeutige Nummer sammeln
_ die Information aus Vergeich, Name, Adresse zu diesen Nummer zuordnen
_ Werte und Vergleich ausgeben.
Die eindeutige Nummer werden mithilfe einer Collection gesammelt: wenn Element noch nicht aufgelistet, dann wird einen neuen Element erzeugt.
Es führt dazu, dass man am einfachsten mit Objekte arbeitet. Daher ist eine einfache Klasse notwendig.
Viel Spass beim Erforschen der Lösung.
https://www.herber.de/bbs/user/155481.xlsm
VG
Yal
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige