Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Nach 3 Kriterien mittels Makro suchen

Nach 3 Kriterien mittels Makro suchen
11.05.2017 15:07:36
Mike
Hallo liebes Forum,
Ich habe gerade versucht, eine Suchabfrage innerhalb von Excel per VBA umzusetzen und bin leider gescheitert, weshalb ich um eure Unterstützung fragen wollte.
Zur Problemstellung:
In meine ersten Tabellenblatt („Blatt1") sind die Spalten A, D, I und Q relevant. Im zweiten Tabellenblatt („Blatt2") sind die Spalten B, D und E relevant.
Es soll nun mittels VBA eine "Verbindung" zwischen den beiden Tabellenblättern hergestellt werden.
Die gesamte Spalte D (Blatt 1) soll nach dem Wert der Zelle B2 (Blatt 2) durchsucht werden UND die gesamte Spalte Q (Blatt 1) soll nach dem Wert der Zelle E2 (Blatt 2) durchsucht werden UND ....
Die Dritte UND-Bedingung sollte folgendermaßen aussehen:
Suchkriterium ist der erste Teil des Strings in Zelle D2 (Blatt 2) bis zum ersten Leerzeichen. Suchbereich soll allerdings auch immer nur der erste Teil des Strings allerdings in jeder Zelle der Spalte I (Blatt 1) sein.
Diese Suche soll auf alle Zeilen innerhalb von Blatt 2 angewendet werden.
Wenn eine Zeile gefunden wird, welche alle drei Bedingungen erfüllt, sollte der Wert aus der Zelle A? (Blatt 1) in die entsprechende Zelle (Q?) im Blatt 2 kopiert werden. Wenn von Excel mehrere mögliche "Werte" gefunden werden, wäre schön, wenn all diese Werte nebeneinander, beginnend in Spalte Q, ausgegeben werden könnten.
Ich hoffe meine Problemstellung ist halbwegs verständlich. Im Prinzip solle es so etwas Ähnliches wie ein 3-facher SVerweis, allerdings mit 2 verschiedenen Tabellenblättern, sein.
Ich hoffe auf eure Unterstützung.
Vielen Dank,
LG
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Nach 3 Kriterien mittels Makro suchen
12.05.2017 10:35:11
Werner
Hallo Mike,
mir ist da noch einiges unklar.
-was wird in Spalte D gesucht, Zahlen, Text?
-was wird in Spalte Q gesucht, Zahlen, Text?
Spalte I ist klar, hier wird nach einem String gesucht.
sollte der Wert aus der Zelle A? (Blatt 1) in die entsprechende Zelle (Q?)

Was meinst du hier?
z.B. Fund auf Blatt 1 in Zeile 25 dann Blatt1 A25 nach Blatt2 Q25?
Wenn von Excel mehrere mögliche "Werte" gefunden werden, wäre schön, wenn all diese Werte nebeneinander, beginnend in Spalte Q, ausgegeben werden könnten.
Und das ist mir auch noch nicht so ganz klar.
Am besten machst du mal eine Beispielmappe mit ein paar Beispieldaten und trägst dann im Blatt2 händisch ein, wie das Ergebnis aussehen soll. Die Mappe dann hier hochladen.
Ich hab da schon den Code dazu geschrieben. Verzichte aber auf das Einstellen wegen der Unklarheiten.
Gruß Werner
Anzeige
AW: Nach 3 Kriterien mittels Makro suchen
13.05.2017 10:01:20
Mike
Hallo Werner,
Danke für deine Antwort.
Nachstehend die benötigten Infos:
- In Spalte D wird nach einem String gesucht (Format: XX XXXXXX).
- In Spalte Q wird nach einer Zahl gesucht, da in dieser Spalte allerdings Kombinationen wie 1.1 vorkommen, habe ich diese Spalte ebenfalls als Text formatiert, also wird auch nach einem String gesucht.
- Korrekt, I ist ebenfalls ein String der Gestalt XX XXXXXX XXXXXX.
- Vollkommen richtig verstanden! Fund auf Blatt 1 in Zeile 25 dann Blatt1 A25 nach Blatt2 Q25?
- Bezüglich mehrerer vorkommender Werte: Ich kann leider nicht ausschließen, dass Excel beim Suchen nur einen passenden Eintrag findet, es können auch mehrere passende Einträge vorkommen. Um dies zu umgehen, sollten alle gefundenen Ergebnisse in ein Array geschriebene werden und am Ende sollte jeder Wert des Arrays entsprechend ausgegeben werden.
Ich bin leider gerade unterwegs, wenn notwendig kann ich natürlich am Nachmittag eine Beispieldatei (ohne Makros :-)) hochladen.
Danke für deine Unterstützung.
GLG Mike
Anzeige
AW: Beispielmappe
12.05.2017 10:39:11
Werner
Hallo Mike,
ich noch mal kurz. Aber bitte nix mit Makros hochladen, kann ich derzeit nämlich nicht downloaden.
Gruß Werner
AW: Beispielmappe
13.05.2017 10:02:08
Mike
Hallo Werner,
Danke für deine Antwort.
Nachstehend die benötigten Infos:
- In Spalte D wird nach einem String gesucht (Format: XX XXXXXX).
- In Spalte Q wird nach einer Zahl gesucht, da in dieser Spalte allerdings Kombinationen wie 1.1 vorkommen, habe ich diese Spalte ebenfalls als Text formatiert, also wird auch nach einem String gesucht.
- Korrekt, I ist ebenfalls ein String der Gestalt XX XXXXXX XXXXXX.
- Vollkommen richtig verstanden! Fund auf Blatt 1 in Zeile 25 dann Blatt1 A25 nach Blatt2 Q25?
- Bezüglich mehrerer vorkommender Werte: Ich kann leider nicht ausschließen, dass Excel beim Suchen nur einen passenden Eintrag findet, es können auch mehrere passende Einträge vorkommen. Um dies zu umgehen, sollten alle gefundenen Ergebnisse in ein Array geschriebene werden und am Ende sollte jeder Wert des Arrays entsprechend ausgegeben werden.
Ich bin leider gerade unterwegs, wenn notwendig kann ich natürlich am Nachmittag eine Beispieldatei (ohne Makros :-)) hochladen.
Danke für deine Unterstützung.
GLG Mike
Anzeige
AW: Beispielmappe
13.05.2017 16:25:11
Piet
Hallo Mike
anbei mal ein Makro Code von mir, bitte in ein normales Modul kopieren.
Zum auflisten kann man waehlen ob das Ergebnis im Blatt 2 in Zeile z=2 oder in der Find Zeile stehen soll. Der Teil für Zeile 2 ist jetzt deaktiviert s. 'z = 2 ; man muss nur das ' entfernen
Der Code listet alles ab Spalte O nach rechts auf. Ich hoffe das hilft dir weiter.
mfg Piet

Option Explicit   '13.5.17    vergleiche Blatt1 mit Blatt2
Dim rfind As Object, SuName1
Dim sFind As Object, SuName2
Dim tFind As Object, Strg3
Sub Vergleiche_Tabellen()
Dim Tb2 As Worksheet, Txt As String
Dim Adr1 As String, z, s As Integer
Set Tb2 = Worksheets("Blatt2")
On Error Resume Next
With Worksheets("Blatt1")
'alte Liste löschen  (Spalten selbst festlegen)
Tb2.Columns("O:Q").ClearContents
SuName1 = Tb2.Range("B2")
SuName2 = Tb2.Range("E2")
Strg3 = Tb2.Range("D2")   'String bis " "
Strg3 = Trim(Left(Strg3, InStr(Strg3, " ")))
'Prüfen ob alle 3 Suchnamen in D, I, Q vorkommen
Set sFind = .Columns("Q").Find(What:=SuName2, After:=.Range("Q1"), _
LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)
If sFind Is Nothing Then MsgBox SuName2 & "  Suchbegriff 2  Zelle E2 nicht gefunden": Exit  _
Sub
Set tFind = .Columns("I").Find(What:=Strg3, After:=.Range("I1"), _
LookIn:=xlValues, LookAt:=xlPart, SearchDirection:=xlNext)
If tFind Is Nothing Then MsgBox Strg3 & "  Suchbegriff 3  Zelle D2 nicht gefunden": Exit  _
Sub
Set rfind = .Columns("D").Find(What:=SuName1, After:=.Range("D1"), _
LookIn:=xlValues, LookAt:=xlWhole, SearchDirection:=xlNext)
If rfind Is Nothing Then MsgBox SuName1 & "  Suchbegriff 1  Zelle B2 nicht gefunden": Exit  _
Sub
Adr1 = rfind.Address
s = 1 '1.ßPalte "O"
'** wahlweise z=2 oder z = 1. Find Zeile
z = rfind.Row   'aktive Zeile, Spalte 1 = "O"
'z = 2           '1. Zeile zum auflisten in Blatt 2
Do  'Do Loop für alle Werte
Txt = .Cells(rfind.Row, "I")
If InStr(Txt, " ") Then Txt = Trim(Left(Txt, InStr(Txt, " ")))
'Spalte Q und String I prüfen
If .Cells(rfind.Row, "Q") = SuName2 And Txt = Strg3 Then
Tb2.Range("Q" & z).Cells(1, s) = .Cells(rfind.Row, "A")
s = s + 1  'next Spalte neben "O"
End If
Set rfind = .Columns("D").FindNext(After:=rfind)
If rfind Is Nothing Then Exit Do
Loop Until rfind.Address = Adr1
End With
End Sub

Anzeige
AW: Beispielmappe
13.05.2017 16:33:30
Piet
Nachtrag
in meinem Code steht "Blatt1" und "Blatt2". Sollte es bei der "Tabelle" + 2 sein bitte diesen Text von "Blatt" in "Tabelle" aendern:
Set Tb2 = Worksheets("Blatt2") = "Tabelle2"
On Error Resume Next
With Worksheets("Blatt1") = "Tabelle1"
AW: Beispielmappe
13.05.2017 16:52:47
Werner
Hallo Mike,
hier meine Version:
Sub Suchen_Vergleichen()
Dim strSuchbegriff1 As String, strSuchbegriff2 As String, strTeil As String
Dim raFundzelle As Range, raSuchbereich As Range
Dim loLetzte As Long, loFundzeile As Long, loSpalte As Long
Dim boGefunden As Boolean
With Worksheets("Tabelle2")
strSuchbegriff1 = .Range("B2")
strSuchbegriff2 = .Range("E2")
loSpalte = 17
On Error Resume Next
If IsError(Left(.Range("D2"), WorksheetFunction.Find(" ", .Range("D2")) - 1)) Then
strTeil = .Range("D2").Value
Else
strTeil = Left(.Range("D2"), WorksheetFunction.Find(" ", .Range("D2")) - 1)
End If
End With
With Worksheets("Tabelle1")
loLetzte = .Cells(.Rows.Count, 4).End(xlUp).Row
Set raSuchbereich = .Range(.Cells(1, 4), .Cells(loLetzte, 4))
End With
With raSuchbereich
Set raFundzelle = .Find(strSuchbegriff1, LookAt:=xlWhole, LookIn:=xlValues)
loFundzeile = raFundzelle.Row
If Not raFundzelle Is Nothing Then
firstAddress = raFundzelle.Address
Do
If raFundzelle.Offset(0, 13) = strSuchbegriff2 And _
raFundzelle.Offset(0, 5) = strTeil Then
boGefunden = True
Worksheets("Tabelle2").Cells(loFundzeile, loSpalte) = _
raFundzelle.Offset(0, -3).Value
loSpalte = loSpalte + 1
End If
Set raFundzelle = .FindNext(raFundzelle)
Loop While Not raFundzelle Is Nothing And raFundzelle.Address  firstAddress
If Not boGefunden Then MsgBox "Keine Übereinstimmungen gefunden"
Else
MsgBox "Suchbegriff " & strSuchbegriff1 & " nicht vorhanden."
End If
End With
On Error GoTo 0
End Sub
Code in ein allgemeines Modul und einer Schaltfläche zuweisen. Tabellenblattnamen ggf. anpassen.
Gruß Werner
Anzeige
AW: Beispielmappe
16.05.2017 22:15:29
Mike
Hallo Zusammen,
Viele Dank für eure Hilfestellung.
Beide Codes funktionieren soweit - Ich würde allerdings benötigen, dass die Prozedur für jede Zeile von Tabellenblatt 2 durchgeführt wir. Kann man das über eine For-Schleife bewerkstelligen?
Weiters hätte ich noch eine Frage: Im Tabellenblatt 2 wird der Teil de Strings bis zum ersten Leerzeichen unter der Variable strTeil (bei der Variante von Werner) gespeichert. In weiterer Folge soll ja im Tabellenblatt 1 jede Zelle der Spalte I nach diesem Teilstring durchsucht werden. Leider habe ich nun festgestellt, dass sich dieser Teilstring nicht unbedingt an erster Stelle befinden muss. Z.B.: strTeil = Wetter, Werte in der zu durchsuchenden Zelle in Spalte I: "Das heutige Wetter ist schön". Es wäre allerdings notwendig, dass alle Zellen erkannt werden, welche den Teilstring strTeil beinhalten, egal wo dieser Teilstring innerhalb der Zelle steht.
Vielen Dank nochmals für eure Unterstützung.
GLG
Anzeige
AW: Beispielmappe
17.05.2017 07:36:25
Werner
Hallo Mike,
ich verstehe nicht, warum die Anforderungen an das Makro immer nur scheibchenweise mitgeteilt werden (aber da bist du nicht der Einzige). Es wäre einfach besser, von Anfang an genau zu beschreiben, was das Makro im Einzelnen so alles machen soll. Dann noch eine Beispielmappe mit ein paar Daten dazu packen (die in ihrer Struktur deinem Original entsprechen) und das Ganze hat Hand und Fuß.
Dann noch eine Anmerkung: Du hast in einem der Beiträge geschrieben, dass du die Ergebnisse der Suche im Blatt 2 in der Zeile der Fundstelle haben möchtest.
Fundstelle Blatt 1 Zelle I24 Ergenis nach Blatt 2 Zelle Q25
Wenn ich mir jetzt ansehe, dass du in Blatt 2 wohl diverse Suchbegriffe in einer Liste untereinander hast die das Makro durchlaufen soll, dann macht das meiner Meinung nach wohl kaum Sinn die Ergebnisse der Suche im Blatt 2 in die Fundzeile von Blatt 1 zu schreiben.
Das hätte ja folgenden Effekt:
Blatt 2 in Zeile 5 stehen die Suchbegriffe
die werden in Blatt 1 in der Zeile 25 gefunden und dann in Blatt 2 in der Zelle Q25 ausgegeben
Dann hat ja die Ausgabe überhaupt nichts mehr mit den Suchbegriffen in Blatt 2 zu tun und lässt sich auch nicht mehr zu diesen zuordnen.
Option Explicit
Sub Suchen_Vergleichen()
Dim strSuchbegriff1 As String, strSuchbegriff2 As String, strTeil As String, firstAddress As  _
String
Dim raFundzelle As Range, raSuchbereich As Range
Dim loLetzte1 As Long, loFundzeile As Long, loSpalte As Long, loLetzte2 As Long, i As Long
Dim boGefunden As Boolean
loLetzte2 = Worksheets("Tabelle2").Cells(Rows.Count, 2).End(xlUp).Row
loSpalte = 17
For i = 2 To loLetzte2
With Worksheets("Tabelle2")
strSuchbegriff1 = .Cells(i, 2)
strSuchbegriff2 = .Cells(i, 5)
On Error Resume Next
If IsError(Left(.Cells(i, 4), WorksheetFunction.Find(" ", .Cells(i, 4)) - 1)) Then
strTeil = .Cells(i, 4).Value
Else
strTeil = Left(.Cells(i, 4), WorksheetFunction.Find(" ", .Cells(i, 4)) - 1)
End If
End With
With Worksheets("Tabelle1")
loLetzte1 = .Cells(.Rows.Count, 4).End(xlUp).Row
Set raSuchbereich = .Range(.Cells(1, 4), .Cells(loLetzte1, 4))
End With
With raSuchbereich
Set raFundzelle = .Find(strSuchbegriff1, LookAt:=xlWhole, LookIn:=xlValues)
loFundzeile = raFundzelle.Row
If Not raFundzelle Is Nothing Then
firstAddress = raFundzelle.Address
Do
If raFundzelle.Offset(0, 13) = strSuchbegriff2 And _
raFundzelle.Offset(0, 5) Like "*" & strTeil & "*" Then
boGefunden = True
Worksheets("Tabelle2").Cells(i, loSpalte) = _
raFundzelle.Offset(0, -3).Value
loSpalte = loSpalte + 1
End If
Set raFundzelle = .FindNext(raFundzelle)
Loop While Not raFundzelle Is Nothing And raFundzelle.Address  firstAddress
loSpalte = 17
If Not boGefunden Then MsgBox "Keine Übereinstimmungen gefunden"
Else
MsgBox "Suchbegriff " & strSuchbegriff1 & " nicht vorhanden."
End If
End With
Next i
On Error GoTo 0
End Sub
Teste das hier mal.
Gruß Werner
Anzeige
AW: Beispielmappe
13.05.2017 17:49:05
Werner
Hallo Mike,
hab gerade noch gesehen, dass du ja wohl in Spalte I nicht nur der ersten Teil des Suchstrings drin stehen hast, sondern den kompletten String. Dann muss an meinem Code noch eine Zeile geändert werden, sonst findet er nix.
Statt:
If raFundzelle.Offset(0, 13) = strSuchbegriff2 And _
raFundzelle.Offset(0, 5) = strTeil Then
so:
If raFundzelle.Offset(0, 13) = strSuchbegriff2 And _
raFundzelle.Offset(0, 5) Like strTeil & "*" Then
Gruß Werner
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Nach 3 Kriterien mittels Makro suchen


Schritt-für-Schritt-Anleitung

  1. Öffne Excel und erstelle zwei Tabellenblätter, benenne sie als "Blatt1" und "Blatt2".
  2. Fülle die relevanten Spalten:
    • In "Blatt1" sollten die Spalten A, D, I und Q gefüllt sein.
    • In "Blatt2" sollten die Spalten B, D und E gefüllt sein.
  3. Öffne den VBA-Editor (Alt + F11) und füge ein neues Modul hinzu.
  4. Kopiere den VBA-Code (siehe Abschnitt „Praktische Beispiele“) in das Modul.
  5. Passe den Code an, falls deine Tabellenblätter anders benannt sind, z.B. "Tabelle1" und "Tabelle2".
  6. Führe das Makro aus. Du kannst dies über das Menü „Entwicklertools“ oder durch Drücken von F5 im VBA-Editor tun.

Häufige Fehler und Lösungen

  • Fehler: "Suchbegriff nicht vorhanden"

    • Lösung: Überprüfe, ob die Daten in den richtigen Spalten stehen und ob die Suchbegriffe korrekt eingegeben sind. Achte auf Groß- und Kleinschreibung.
  • Fehler: Makro läuft nicht korrekt

    • Lösung: Stelle sicher, dass alle relevanten Zellen gefüllt sind und dass der Code im richtigen Modul eingefügt wurde.
  • Fehler: Ergebnisse werden nicht angezeigt

    • Lösung: Überprüfe den Code, insbesondere die Bereiche, in denen nach den Suchbegriffen gesucht wird. Achte darauf, dass die Bedingungen für die Suche korrekt sind.

Alternative Methoden

Wenn das Makro nicht die gewünschte Funktionalität bietet, kannst du auch die folgenden Methoden in Betracht ziehen:

  • Verwendung von Excel-Formeln: Du kannst Funktionen wie SVERWEIS oder FILTER verwenden, um Daten zwischen den Tabellenblättern zu verknüpfen.
  • Power Query: Mit Power Query kannst du komplexe Datenabfragen durchführen, die auf mehreren Bedingungen basieren.

Praktische Beispiele

Hier ist ein Beispiel für den VBA-Code, den du verwenden kannst:

Option Explicit
Sub Vergleiche_Tabellen()
    Dim Tb2 As Worksheet, Txt As String
    Dim Adr1 As String, z As Long, s As Integer
    Set Tb2 = Worksheets("Blatt2")
    On Error Resume Next
    With Worksheets("Blatt1")
        Tb2.Columns("O:Q").ClearContents
        Dim SuName1 As String, SuName2 As String, Strg3 As String
        SuName1 = Tb2.Range("B2")
        SuName2 = Tb2.Range("E2")
        Strg3 = Trim(Left(Tb2.Range("D2"), InStr(Tb2.Range("D2"), " ") - 1))

        ' Suche nach den Bedingungen
        Set rfind = .Columns("D").Find(What:=SuName1, LookIn:=xlValues, LookAt:=xlWhole)
        If Not rfind Is Nothing Then
            ' Weitere Bedingungen hier hinzufügen
        End If
    End With
End Sub

Tipps für Profis

  • Verwende Option Explicit am Anfang deines Codes, um sicherzustellen, dass alle Variablen deklariert werden. Das hilft, Fehler zu vermeiden.
  • Kommentiere deinen Code gründlich, um die Lesbarkeit und Wartbarkeit zu verbessern.
  • Nutze Fehlerbehandlungsroutinen, um den Code robuster zu machen, insbesondere wenn du mit Benutzereingaben arbeitest.

FAQ: Häufige Fragen

1. Frage
Kann ich das Makro automatisieren, sodass es bei jeder Änderung in den Daten ausgeführt wird?
Antwort: Ja, du kannst das Makro in das Worksheet-Event „Change“ einfügen, um es automatisch auszuführen, wenn Daten geändert werden.

2. Frage
Funktioniert das Makro auch in Excel Online?
Antwort: Leider nicht, da VBA nur in der Desktop-Version von Excel unterstützt wird. Alternativen wie Power Automate könnten jedoch helfen.

3. Frage
Was mache ich, wenn die Daten in den Spalten nicht übereinstimmen?
Antwort: Überprüfe die Formatierung der Zellen und stelle sicher, dass sie einheitlich sind, beispielsweise Text oder Zahl.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige