Anzeige
Archiv - Navigation
1904to1908
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

Suchen in Tabelle

Suchen in Tabelle
29.10.2022 22:33:36
Ron
Hallo,
wer kann helfen?
Ich möchte eine Nummer aus der Tabelle PLZ ermitteln lassen.
Im ersten Schritt sollen Straße und PLZ abgeglichen werden. Wenn Treffer erfolgt, dann soll eine Nummer ausgegeben werden.
Wenn kein Treffer erfolgt, dann soll die Suchoption auf Ort und PLZ geändert und weitergesucht werden, und zwar von PLZ3 nach PLZ in der Tabelle PLZ.
Ich bekomme das wechseln der Suchoption und das Weiersuchen nicht hin.
Danke
https://www.herber.de/bbs/user/155927.xlsm

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suchen in Tabelle
30.10.2022 12:36:50
ralf_b
Hier was zum Testen.

Option Explicit
Sub sbStart()
Dim lstrow As ListRow
Range("F2:F" & Cells(Rows.Count, 6).End(xlUp).Row).ClearContents
With ActiveSheet.ListObjects("Tabelle1")
'wenn Name der Tabelle im Original anders, dann hier anpassen
For Each lstrow In .ListRows
With lstrow.Range
If .Cells(1).Value  vbNullString And _
.Cells(2).Value  vbNullString And _
.Cells(4).Value  vbNullString Then
If Not IsNumeric(.Cells(3).Value) Then 'numerische Werte überspringen
.Cells(3).Value = sbPLZ(.Cells, "PLZ")
End If
Else
.Cells(3).Value = vbNullString
'wenn Daten von Strasse, PLZ und Ort fehlen dann Nummer leer lassen
End If
End With
Next
End With
End Sub
Function sbPLZ(rng As Range, ByVal blatt As String)
Dim larr, lRow&, lCol&
With Worksheets(blatt)
larr = .UsedRange
'schleife rückwärts über Spalten
For lCol = UBound(larr, 2) To LBound(larr, 2) Step -1
If larr(1, lCol) Like "STRASSE*" Then
''schleife über Zeilen
For lRow = LBound(larr) To UBound(larr)
If larr(lRow, lCol - 1) = rng.Cells(2).Text And _
LCase(larr(lRow, lCol)) = LCase(rng.Cells(1).Text) Then 'Prüfung Strasse
sbPLZ = CDbl(larr(lRow, lCol - 2))
Exit Function             'Austieg wenn gefunden
End If
Next
Else                                  'Wenn Strasse kein Treffer, suche nach Ort-Spalte
If larr(1, lCol) Like "ORT*" Then
For lRow = LBound(larr) To UBound(larr)
If CStr(larr(lRow, lCol - 1)) = rng.Cells(2).Text And _
LCase(larr(lRow, lCol)) = LCase(rng.Cells(4).Text) Then 'Prüfung "Ort"
sbPLZ = CDbl(larr(lRow, lCol - 2))
Exit Function         'Austieg wenn gefunden
End If
Next
End If
End If
Next
sbPLZ = "?"                             'Rückgabewert wenn nicht gefunden
End With
End Function

Anzeige
AW: Suchen in Tabelle
30.10.2022 16:45:42
Ron
Hallo,
habe den Code probiert. Leider läuft er nicht und ich kann den Fehler nicht finden.
Trotzdem Danke
AW: Suchen in Tabelle
30.10.2022 16:53:05
ralf_b
tausche mal diesen Bereich aus.
ansonsten kann man dir nicht helfen, wenn der Fehler nicht bekannt ist.
Der Code basiert auf deiner Beispieldatei und deren Daten und ist dort lauffähig.

 If Not IsNumeric(.Cells(3).Value) Or _
.Cells(3).Value = vbNullString Then 'numerische Werte überspringen
.Cells(3).Value = sbPLZ(.Cells, "PLZ")
End If

AW: Suchen in Tabelle
30.10.2022 17:18:14
Ron
Hallo,
jetzt läuft es. Der Abgleich dauert aber sehr lange.
Ich habe die originale PLZ Tabelle verwendet (150.000 Datensätze).
Ich habe 6 Anschriften angelegt. Der Abgleich dauerte 41 Sekunden.
In zwei Anschriften kam es zu Fehlern. Irgendwie scheint er nicht richtig Ort+PLZ abzugleichen.
Bei Berlin spuckte er die erste gefundene Nummer aus, ohne die PLZ zu berücksichtigen.
Gruß
Anzeige
AW: Suchen in Tabelle
30.10.2022 18:23:58
ralf_b
tchja was soll ich sagen? So ein vba Code berücksichtigt nicht alle Eventualitäten. Was du in Foren bekommst, ist nur der Weg gerade durch.
Für einen genaueren Befund, müßte man die Datei sehen, die den Fehler erzeugt.
Was die Verarbeitungsgeschwindigkeit angeht, kann man da bestimmt was mit der Calculation und dem Screenupdating machen.
update
30.10.2022 18:43:35
ralf_b
und was ist damit?

Option Explicit
Sub sbStart()
Dim lstrow As ListRow
Range("F2:F" & Cells(Rows.Count, 6).End(xlUp).Row).ClearContents
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlManual
End With
With ActiveSheet.ListObjects("Tabelle1")
'wenn Name der Tabelle im Original anders, dann hier anpassen
For Each lstrow In .ListRows
With lstrow.Range
If .Cells(1).Value  vbNullString And _
.Cells(2).Value  vbNullString And _
.Cells(4).Value  vbNullString Then
If Not IsNumeric(.Cells(3).Value) Or _
.Cells(3).Value = vbNullString Then 'numerische Werte überspringen
.Cells(3).Value = sbPLZ(.Cells, "PLZ")
End If
Else
.Cells(3).Value = vbNullString
'wenn Daten von Strasse, PLZ und Ort fehlen dann Nummer leer lassen
End If
End With
Next
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = xlAutomatic
End With
End Sub
Function sbPLZ(rng As Range, ByVal blatt As String)
Dim larr, lRow&, lCol&
Dim var1$, var2$, var3$, var4$
With Worksheets(blatt)
larr = .UsedRange
var1 = rng.Cells(1).Value
var2 = rng.Cells(2).Value
'var3 = rng.Cells(3).Value
var4 = rng.Cells(4).Value
'schleife rückwärts über Spalten
For lCol = UBound(larr, 2) To LBound(larr, 2) Step -1
If larr(1, lCol) Like "STRASSE*" Then
''schleife über Zeilen
For lRow = LBound(larr) To UBound(larr)
If larr(lRow, lCol - 1) = var2 And _
LCase(larr(lRow, lCol)) = LCase(var1) Then 'Prüfung Strasse
sbPLZ = CDbl(larr(lRow, lCol - 2))
Exit Function             'Austieg wenn gefunden
End If
Next
Else                                  'Wenn Strasse kein Treffer, suche nach Ort-Spalte
If larr(1, lCol) Like "ORT*" Then
For lRow = LBound(larr) To UBound(larr)
If CStr(larr(lRow, lCol - 1)) = var2 And _
LCase(larr(lRow, lCol)) = LCase(var4) Then 'Prüfung "Ort"
sbPLZ = CDbl(larr(lRow, lCol - 2))
Exit Function         'Austieg wenn gefunden
End If
Next
End If
End If
Next
sbPLZ = "?"                             'Rückgabewert wenn nicht gefunden
End With
End Function

Anzeige
AW: update
30.10.2022 19:35:13
Ron
Hallo,
Der Code ist der Hammer. Der ballert durch die Daten wie ein heißes Messer durch die Butter.
Und diesmal stimmen alle Abgleiche.
Vielen, vielen DANK!
Das Einzige was mir aufgefallen ist, wenn ich nachträglich die Anschrift in der Tabelle "Daten" ändere und dann den Code starte, ändert er die Nummer nicht.
Erst wenn ich die Nummer vorher per Hand entferne und den Code starte, ändert sich die Nummer.
Warum überschreibt er beim zweiten Durchlauf nicht die Zelle?
Noch eine kurze Frage. Wo kann ich eine kleine MsgBox mit Abschlussmitteilung einfügen?
Gruß
Anzeige
AW: update
31.10.2022 08:00:31
ralf_b
es werden nur Nummern erneuert wo keine Nummer oder ein Text z.b. ? in der Zelle steht.
Ich hatte es so verstanden das nur Lücken oder unklare Nummern gesucht werden sollen.
die Messagebox am Ende einfügen

.Calculation = xlAutomatic
End With
msgbox "Fertig"
End Sub
willst du die Prüfung auf leer oder Text wegnehmen ,dann die IF abfrage um die sbPLZ Zuweisung wegnehmen oder auskommentieren

If Not IsNumeric(.Cells(3).Value) Or _
.Cells(3).Value = vbNullString Then 'numerische Werte überspringen
.Cells(3).Value = sbPLZ(.Cells, "PLZ")
End If

Anzeige
AW: update
31.10.2022 11:56:25
Ron
Hallo,
echt super DANKE!
Ich habe die Abschlussmeldung soweit hinbekommen

If WorksheetFunction.CountIf(Range("C:C"), "?") > 0 Then 'wenn in Spalte C "?" vorhanden dann
MsgBox "?"
Else
MsgBox "perfekt"
End If
Jetzt habe ich das Problem, wenn der Code durchgelaufen ist, aber aufgrund fehlender Anschriftsdaten keine Nummer erstellt wurde, dass er mir die MsgBox "perfekt" ausgibt.
Wie bekomme ich das hin, dass leere Zellen ignoriert werden?
Sozusagen: Wenn die Zelle leer ist, mache nichts. Wenn in der Zelle was steht aber nicht "?", dann MsgBox "perfekt" sonst MsgBox "?"
Gruß
Anzeige
AW: update
31.10.2022 13:31:28
ralf_b
leere Zeilen werden bereits ignoriert. Also mache nichts, ist ja ok oder etwa nicht. und für ein "perfekt " nicht relevant.
Hier wird geprüft ob Adressinformationen vorhanden sind und wenn ja dann wird die Nummer gesucht. Aber nur wenn alle drei Zellen leer sind. Also wäre evtl. hier ein Ansatzpunkt für eine Anpassung.

If .Cells(1).Value  vbNullString And _
.Cells(2).Value  vbNullString And _
.Cells(4).Value  vbNullString Then

AW: update
31.10.2022 18:15:39
Ron
Hallo,
die leeren Zellen habe ich versucht zu berücksichtigen.
Ich habe eine Schleife gebastelt, die eigentlich alles abfragen soll.
Trotzdem funktioniert das nicht so richtig.

With Tabelle1
For i = 1 To 10
If Cells(i, 3).Value = "" Then 'wenn in den Zellen nichts steht
Exit For    'beende die Schleife
Else    'sonst
If Cells(i, 3).Value = "?" Then   'wenn in einer Zelle "?" steht
MsgBox "?"    'dann schreibe eine MsgBox
Exit For        'und beende die Schleife
Else    'sonst
MsgBox "perfekt"    'schreibe eine MsgBox
End If
End If
Next i
End With
Wo steckt denn der Fehler?
Gruß
Anzeige
AW: update
31.10.2022 19:12:40
ralf_b
tut mir leid, was soll das werden? Eine Neverending Story. Du machst irgendwas und ich sage dir was du falsch machst?
hier meine letzte Hilfe dafür.

 With ActiveSheet.ListObjects("Tabelle1")
'wenn Name der Tabelle im Original anders, dann hier anpassen
For Each lstrow In .ListRows
With lstrow.Range
If .Cells(1).Value  vbNullString And _
.Cells(2).Value  vbNullString And _
.Cells(4).Value  vbNullString Then
If Not IsNumeric(.Cells(3).Value) Or _
.Cells(3).Value = vbNullString Then 'numerische Werte überspringen
.Cells(3).Value = sbPLZ(.Cells, "PLZ")
End If
Else
.Cells(3).Value = vbNullString
'wenn Daten von Strasse, PLZ und Ort fehlen dann Nummer leer lassen
End If
End With
Next
Dim b&, l&, msg$
msg = .ListRows.Count & " Zeilen gesamt" & vbLf
l = WorksheetFunction.CountBlank(.ListColumns("Nummer").DataBodyRange)
b = WorksheetFunction.CountIf(.ListColumns("Nummer").DataBodyRange, "?")
If b + l = 0 Then
MsgBox "perfekt"   'schreibe eine MsgBox
Else
If l > 0 Then msg = msg & l & " leere Zeilen " & vbLf
If b > 0 Then msg = msg & b & " nicht gefunden"
MsgBox msg
End If
End With

Anzeige
AW: update
31.10.2022 19:32:56
Ron
Hallo,
vielen Dank!
Gruß

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige