Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
892to896
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
892to896
892to896
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Suche auf Maskierte Artikelnummer?

Suche auf Maskierte Artikelnummer?
10.08.2007 10:50:00
Yosherl
Hallo,
ich habe ein Problem, und zwar versuche ich eine Artikelnummer aus Datei 1 in Datei 2 zu finden, mit einem sverweis. Eigentlich einfach. Jedoch geht es nicht, da Excel nicht auf Maskierung suchen kann.
Hier ein Beispiel:
Nummer 1: CRCW08051K00FKEA aus Datei 1
Damit mache ich einen Sverweis auf Datei 2, in der die Nummer wie folgt steht:
CRCW0805?FK?
--------
Wenn ich es umgekehrt mache funzt es. Sprich ich kann die maskierte Nummer nehmen und in der ersten Datei suchen, was ich aber nicht möchte.
Der Weg soll sein: CRCW08051K00FKEA --- CRCW0805?FK?
Wo die ? stehen, weiss man nicht, die können überall in der Nummer auftauchen..
Kennt jemand eine Lösung in VBA für das Problem, ist sowas überhaupt möglich?
grüße,
yosherl

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suche auf Maskierte Artikelnummer?
10.08.2007 15:46:50
Harry
Hallo,
ob es eine Excel-Funktion dafür gibt, kann ich dir nicht genau sagen - habe aber keine im Kopf.
Da du aber immer VBA schreibst - in VBA einfach einen Parser schreiben, der beide Strings auf Gleichheit prüft und dabei beliebige Jokerzeichen (hier "?") beachtet
anbei mal ein Entwurf als Sub Pruefung, die auf Button-klick in Tabelle 2 Spalte B die Ergebnisse auswirft. Umwandlung in Funktion und Verwendung anstelle SVerweis sollte dann ja kein Problem mehr sein.l
hier der Link https://www.herber.de/bbs/user/44946.xls
Gruß
Harry

Anzeige
AW: Suche auf Maskierte Artikelnummer?
10.08.2007 15:49:00
fcs
Hallo yosherl,
in diesem Fall hilft nur ein zeichenweiser Vergleich der Zelleinträge. Dieser dauert leider sehr viel länger als die Nutzung der Funktion SVERWEIS.
Codebeispiel:

Sub MaskenSuche()
Dim Zelle1 As Range, strSuch As String, wb1 As Workbook, wks1 As Worksheet, i As Long
Dim Zelle2 As Range, wb2 As Workbook, wks2 As Worksheet, boGefunden As Boolean
Set wb1 = Workbooks("YoshDatei1.xls")
Set wks1 = wb1.Worksheets("Tab1")
Set Zelle1 = ActiveCell
strSuch = Zelle1.Value 'Suchbegriff
'Datei und Tabelle in der gesucht werden soll
Set wb2 = Workbooks("YoshDatei2.xls")
Set wks2 = wb2.Worksheets("Tab1")
'Spalte 1 in YoshDatei2.xls!Tab1 auf passenden Eintrag durchsuchen
For Each Zelle2 In wks2.Range(wks2.Cells(1, 1), wks2.Cells(wks2.Rows.Count, 1).End(xlUp))
boGefunden = True
If Len(Zelle2.Value) = Len(strSuch) Then
For i = 1 To Len(strSuch)
If Not (Mid(Zelle2.Value, i, 1) = Mid(strSuch, i, 1) _
Or Mid(Zelle2.Value, i, 1) = "?") Then
boGefunden = False
Exit For
End If
Next
Else
boGefunden = False
End If
If boGefunden = True Then
MsgBox "Suchbegriff: " & strSuch & " passt zu: " & Zelle2.Value & "in Zelle: " & Zelle2. _
Address
Exit For
End If
Next
If boGefunden = False Then
MsgBox "Für Suchbegriff: " & strSuch & " wurde kein passender Eintrag gefunden"
End If
End Sub


Falls du aus der 2. Datei für den gefundenen Eintrag Werte aus anderen Spalten auslesen möchtest, dann kannst du dies mit der Offset-Methode: Beispiel


Wert2 = Zelle2.Offset(1, 2)


Gruß
Franz

Anzeige
AW: Suche auf Maskierte Artikelnummer?
10.08.2007 16:34:00
Yosherl
Hallo,
ja ich habe das gerade versucht.
Nach 13 Minuten habe ich abgebrochen und er hatte die ersten 187 Zeilen... von knapp 40.000.
Die zweite Datei hat derzeit 7000 Zeilen. Wenn ich mich nun nicht verrechnet habe, wären das ~47 Stunden, das ist zulange ;-)
Bräuche etwas was unter 30 minuten läuft, ich hoffe es hat noch jemand eine Idee wie man das machen könnte.
Grüße,
yosherl

AW: Suche auf Maskierte Artikelnummer?
10.08.2007 16:51:00
Harry
Hallo
das Beispiel von Franz ist schon relativ simpel vom Aufbau und glaub ich kaum noch optimierbar ohne spezielle Excel-Such-und-Vergleichsfunktion.
Mein Vorschlag wäre noch, die beide Tabellen (nur die relevanten Spalten) in zwei Arrays einzulessen und dann mit den Arrays zu arbeiten. Weiß aber nicht, ob das große Performance-Vorteile bringt. -Zumindest wohl keinen Sprung auf 30min.
Lasse aber mal für andere offen
Gruß
Harry

Anzeige
AW: Suche auf Maskierte Artikelnummer?
10.08.2007 17:06:00
Harry
Noch eine Idee
derzeit suchst du mit 40.000 Strings aus Tabelle 1 die 7000 strings aus Tabelle 2 (welche Joker enthalten) mit VBA-Routine durch. Und du suchst immer nur den ersten passenden String in Tabelle 2?
Dann drehe die suche um, suche mit dem String aus Tabelle 2 in Tabelle 1 (und hier funktioniert ja der SVERWEIS mittels Jokerzeichen)
Logik
Für Tabelle 2.Spalte A. Zelle 1 bis letzte Zelle der Liste
Verwendung der SVERWEIS(WertTabelle2; Bereich Tabelle1(Anfang bis Ende Liste)-Funktion
Wenn Gefunden und Spalte B in Tabelle 1 nicht belegt, dann Wert (Fundstellenzeile in Tabelle 2 o.ä.) in Tabelle1.SpalteB eintragen
hier Schleife auf SVERWEIS mit neuem Suchintervall (WertTabelle2; Bereich Tabelle1(letzteFundstelle+1 bis Ende Liste)
Next Zeile in Tabelle 2
Das sollte dann deutlich performanter sein.
Gruß
Harry

Anzeige
AW: Suche auf Maskierte Artikelnummer?
10.08.2007 19:22:00
Harry
Hallo,
hier mal umgesetzt, benötige für die Dimension 40.000 Sätze * 7.000 Sätze bei meinem lahmen Rechner 3min 15sec

Sub Tabelle1fuellen()
Dim longR As Long
With Sheets("Tabelle1")
.Cells(1, 1) = "Suchstrings"
.Range("A:A").NumberFormat = "@"
For longR = 2 To 40000
.Cells(longR, 1) = CStr(Format((longR + 3) Mod 7000, "00000000"))
Next
End With
End Sub
Sub Tabelle2fuellen()
Dim longR As Long
With Sheets("Tabelle2")
.Cells(1, 1) = "Suchtabelle"
.Range("A:A").NumberFormat = "@"
For longR = 2 To 7000
.Cells(longR, 1) = CStr(Format((longR - 1) Mod 7000, "00000000"))
Next
End With
End Sub
Sub Abgleich2()
Dim rg As Range
Dim rg2 As Range
Dim lngR As Long
Dim lngR2 As Long
Dim arrArray As Variant
Dim arrArray2 As Variant
Dim i As Long
Dim i2 As Long
lngR2 = Sheets("Tabelle2").Range("A65536").End(xlUp).Row
lngR = Sheets("Tabelle1").Range("A65536").End(xlUp).Row
arrArray = Sheets("Tabelle1").Range("a1:a" & lngR).Value
arrArray2 = Sheets("Tabelle2").Range("a1:a" & lngR2).Value
Sheets("Tabelle1").Range("G7") = "Start"
Sheets("Tabelle1").Range("G8") = Time
For i2 = 2 To lngR2
For i = 2 To lngR
If arrArray(i, 1) Like arrArray2(i2, 1) Then
If (Sheets("Tabelle1").Range("B" & i) = "") Then
Sheets("Tabelle1").Range("B" & i) = "gefunden Tabelle 2 Zeile " & CStr(i2)
arrArray(i, 1) = "ßßßßßßß" 'hier einen def. ausgeschlossenen String wählen
End If
End If
Next
If (i2 Mod 5) = 0 Then
Sheets("Tabelle1").Range("G6") = i2
End If
Next
Sheets("Tabelle1").Range("G9") = "Ende"
Sheets("Tabelle1").Range("G10") = Time
End Sub


Tabelle1fuellen und Tabelle2füllen generieren Musterdaten (evtl. manuell noch ein paar Joker in die Daten) und dann Abgleich2
Gruß
Harry

Anzeige
AW: Suche auf Maskierte Artikelnummer?
10.08.2007 19:01:25
fcs
Hallo yosherl,
bei der Datenmenge wird es schwierig.
Wenn die Daten in der 2. Datei aufsteigend sortiert sind (Zuerst die mit ? am Anfang, dann die restlichen), dann bringt folgende Anpasssung eine Beschleunigung.
Die Zellen mit ? als 1. Zeichen werden komplett duchsucht.
Dann wird nach der Zelle gesucht in der der 1. Anfangsbuchstabe übereinstimmt. Keine Ahnung wie gross der Zeitgewinn wird. Das hängt jetzt von den Datenmengen der einzelnen Buchstabengruppen ab.
Ob weitere Beschleunigungen möglich sind, kann man nur abschätzen, wenn man die Daten besser kennt.
Evtl. ist es tatsächlich auch sinnvoll, die zu vergleichenden Daten jweils in ein Array einzulesen. Immerhin brachte alleine das Einlesen des zu vergleichenden Strings in eine Variable schon fast 50% Zeitgewinn.
Gruß
Franz

Sub MaskenSuche()
Dim Zelle1 As Range, strSuch As String, wb1 As Workbook, wks1 As Worksheet, i As Long
Dim Zelle2 As Range, wb2 As Workbook, wks2 As Worksheet, boGefunden As Boolean
Dim strFinden As String, start2 As Range
Set wb1 = Workbooks("YoshDatei1.xls")
Set wks1 = wb1.Worksheets("Tab1")
Set Zelle1 = ActiveCell
strSuch = Zelle1.Value 'Suchbegriff
'Datei und Tabelle in der gesucht werden soll
Set wb2 = Workbooks("YoshDatei2.xls")
Set wks2 = wb2.Worksheets("Tab1")
'Spalte 1 in YoshDatei2.xls!Tab1 auf passenden Eintrag durchsuchen
'Zellen mit ? als 1. Zeichen durchsuchen
For Each Zelle2 In wks2.Range(wks2.Cells(1, 1), wks2.Cells(wks2.Rows.Count, 1).End(xlUp))
strFinden = Zelle2.Value
boGefunden = False
If Left(strFinden, 1)  "?" Then
Exit For
Else
If Len(strFinden) = Len(strSuch) Then
boGefunden = True
For i = 1 To Len(strSuch)
If Not (Mid(strFinden, i, 1) = Mid(strSuch, i, 1) _
Or Mid(strFinden, i, 1) = "?") Then
boGefunden = False
Exit For
End If
Next
Else
boGefunden = False
End If
End If
If boGefunden = True Then
MsgBox "Suchbegriff: " & strSuch & " passt zu: " & strFinden & "in Zelle: " & Zelle2. _
Address
Exit For
End If
Next
'Restliche Zellen  durchsuchen
If boGefunden = False Then
'Zelle suchen ab der 1. Zeichen übereinstimmt
If Left(strFinden, 1) = Left(strSuch, 1) Then
Set start2 = Zelle2
Else
Set start2 = wks2.Range(Zelle2, wks2.Cells()).Find(What:=Left(strSuch, 1) & "*", _
After:=Zelle2, LookIn:=xlFormulas, LookAt:=xlWhole)
End If
If start2 Is Nothing Then
boGefunden = False
Else
For Each Zelle2 In wks2.Range(start2, wks2.Cells(wks2.Rows.Count, 1).End(xlUp))
strFinden = Zelle2.Value
boGefunden = False
If Left(strFinden, 1)  Left(strSuch, 1) Then Exit For
If Len(strFinden) = Len(strSuch) Then
boGefunden = True
For i = 1 To Len(strSuch)
If Not (Mid(strFinden, i, 1) = Mid(strSuch, i, 1) _
Or Mid(strFinden, i, 1) = "?") Then
boGefunden = False
Exit For
End If
Next
Else
boGefunden = False
End If
If boGefunden = True Then
MsgBox "Suchbegriff: " & strSuch & " passt zu: " & strFinden & "in Zelle: " & Zelle2. _
Address
Exit For
End If
Next
End If
End If
If boGefunden = False Then
MsgBox "Für Suchbegriff: " & strSuch & " wurde kein passender Eintrag gefunden"
End If
End Sub


Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige