Anzeige
Archiv - Navigation
1536to1540
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-Finden nach PDF Import etwas Tricky!

Suchen-Finden nach PDF Import etwas Tricky!
19.01.2017 15:23:57
Nilo
Moin zusammen,
ich wieder!
Jetzt bin ich mit diversen Dingen weitergekommen und hänge aktuell an dieser Aufgabenstellung:
PDF Daten werden in Spalte A kopiert.
Wird alles schön einzelne Zellen aufgebröselt wobei in jeder Zelle dann diverser Text steht (TextinSpalten nutzt hier nichts)
In den Zellen befinden sich jetzt Werte die ich mit einer Masterliste finden möchte. Da klappt bis hier ganz gut so:
=WENN(ZÄHLENWENN(A:A;"*"&Masterliste!A1&"*")0;""&Masterliste!A1&"";"na")
Problem:
Die Masterliste ist bis zu A2:A35000
Die importierten Daten sind variabel lang.
Er findet Zwar alles aber natürlich nur an der Stelle wo der Datensatz in der Masterliste steht.
Wie schaffe ich es das:
Suche/Finde in A:A anhand der Masterliste nach dem PDF Import und schreibe in B:B
direkt daneben den gefunden Wert!?
Also Wenn zB in Zelle A298 "JaNeisKlar_HalloWelt123+++!Bienchen" steht
in der Masterliste HalloWelt123 als Wert hinterlegt ist dann schreibe in B298 HalloWelt123
Simpel im Prozess aber ich weiß nicht wie ich das machen muss!!!
Danke und Gruß
Nilo

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Suchen-Finden nach PDF Import etwas Tricky!
19.01.2017 15:52:01
Michael
Hi,
sind die einzelnen Begriffe IMMER Zeichen aus [A-Z], [a-z] und [0-9]?
D.h., wäre eine Trennung der Begriffe durch Eliminierung/Ersetzung der Sonderzeichen möglich, so daß die drei Begriffe "JaNeisKlar", "HalloWelt123" und "Bienchen" weiterzuverarbeiten wären?
Dann würde zwar "Hallo_Welt" in zwei Begriffe aufgeteilt werden, aber wenn das ok wäre, hätte ich einen Ansatz mit VBA im Kopf...
Gruß,
Michael
AW: Suchen-Finden nach PDF Import etwas Tricky!
19.01.2017 16:01:13
Nilo
Hi Micheal,
ne nicht ganz da es Begriffe gibt die durch Sonderzeichen verbunden sind zB "AAA_AAA" oder "45.45-45"
Die in der Masterliste hinterlegten Werte müssen exakt so gesucht bzw. gefunden werden.
Ich habe gerade eine Formel gefunden und angepasst die genau meine Vorgabe/Vorstellung erfüllt aber aufgrund der Matrix elend langsam ist.
Wenn es dafür eine VBA Lösung gäbe dann ist das schon fast die volle Miete ;)
{=INDEX(Masterliste!A2:A35000;VERGLEICH(FALSCH;ISTFEHLER(FINDEN(Masterliste!A2:A35000;A2));0))}
Gruß
Anzeige
AW: Suchen-Finden nach PDF Import etwas Tricky!
19.01.2017 16:26:35
Michael
Hi,
wieviele Zeichen hat denn der *kürzeste* Begriff in der Masterliste?
Die genannten Beispiele hatten ja immer mindestens 7 Zeichen, und bei 35000 Begriffen ist ja auch nicht davon auszugehen, daß etwa ein einzelnes "A" drinsteht: aber wie isses konkret?
Gruß,
M.
P.S.: Groß- und Kleinschreibung? owT
19.01.2017 16:27:57
Michael
ach so, ist ja immer bei finden() owT
19.01.2017 16:29:29
Michael
Schnelles Vergleichen mit Dictionary
19.01.2017 18:20:22
Michael
Hi,
anbei Testdatei: der 1. Button erzeugt Testwerte ...
a) für die Masterliste und
b) für die importierte Liste
Sub testWerte()
Dim a$(), b$(), i&, j&, r&, s$
Const Mu = 5, Mo = 8    ' Anzahl Zeichen Masterliste von-bis
Const Zu = 65, Zo = 125 ' Nr. des Zeichens von-bis
Const Lu = 1, Lo = 3500 ' Anzahl Werte Masterliste von-bis
Const Iu = 1, Io = 350  ' Anzahl Werte Import von-bis
ReDim a(Lu To Lo, 1 To 1)
ReDim b(Iu To Io, 1 To 1)
Randomize
For i = Lu To Lo
r = WorksheetFunction.RandBetween(Mu, Mo)
For j = 1 To r
a(i, 1) = a(i, 1) & Chr(WorksheetFunction.RandBetween(Zu, Zo))
Next
Next
For i = 1 To Int(Lo / 10) ' paar Werte durch "ähnliche" ersetzen
r = WorksheetFunction.RandBetween(Lu, Lo - 3)
s = a(r, 1)
For j = 0 To 2
a(r + j, 1) = s & Chr(WorksheetFunction.RandBetween(Zu, Zo))
Next
Next
Sheets("Masterliste").Range("A2:A100000").ClearContents
Sheets("Masterliste").Range("A2").Resize(UBound(a)) = a
For i = Iu To Io
r = WorksheetFunction.RandBetween(Mu, Mo)
For j = 1 To r
b(i, 1) = b(i, 1) & Chr(WorksheetFunction.RandBetween(Zu, Zo))
Next
r = WorksheetFunction.RandBetween(Iu, Io)
b(i, 1) = b(i, 1) & a(r, 1)
r = WorksheetFunction.RandBetween(Mu, Mo)
For j = 1 To r
b(i, 1) = b(i, 1) & Chr(WorksheetFunction.RandBetween(Zu, Zo))
Next
Next
Sheets("Import").Range("A2:A100000").ClearContents
Sheets("Import").Range("A2").Resize(UBound(b)) = b
End Sub
Der zweite Button wertet sie aus und schreibt das Ergebnis in Spalte B (Import-Blatt):
Sub vglWerte()
Dim a, b, lb&, i&, j&, k&, p&, s$, o As Object, oi, ois
Dim ok As Boolean
Const ml = 5 ' minimale Länge in Masterliste, je höher, desto fixer
Dim t0 As Single
t0 = Timer
Set o = CreateObject("scripting.dictionary")
a = Sheets("Masterliste").Range("A1").CurrentRegion
Sheets("Import").Range("B:B").ClearContents
b = Sheets("Import").Range("A1").CurrentRegion
For i = 2 To UBound(a)
s = Left(a(i, 1), ml)
If o(s) = "" Then
'     o(s) = "|" & a(i, 1)
o(s) = Chr(0) & a(i, 1)
Else
If InStr(2, o(s), a(i, 1), vbBinaryCompare) = 0 Then _
o(s) = o(s) & Chr(0) & a(i, 1)
End If
Next
'Stop
For i = 2 To UBound(b)
ok = False
lb = Len(b(i, 1))
For j = 1 To lb   ' im Prinzip nur bis lb-ml+1
s = Mid(b(i, 1), j, ml)
If o.exists(s) Then
'  Stop
ois = Split(o(s), Chr(0))
For k = 1 To UBound(ois)
p = InStr(2, b(i, 1), ois(k), vbBinaryCompare)
If p > 0 Then b(i, 1) = ois(k): ok = True: Exit For
Next
End If
If ok Then Exit For
Next
Next
Sheets("Import").Range("B1").Resize(UBound(b)) = b
Sheets("Import").Range("G5").Value = UBound(b) - 1 & " aus " & _
UBound(a) - 1 & " in " & (Timer - t0) * 1000 & " ms."
End Sub
Die Datei: https://www.herber.de/bbs/user/110723.xlsm
Die Idee ist, die Mindestzeichenlänge der Masterliste (Const ml = 5) in ein Dictionary einzulesen und dort alle Varianten zwischenzuspeichern, also:
- in der ML existieren z.B. die drei Begriffe: Auto_Benz, Auto_Opel und Auto_Ford; der "Key" im Dict. heißt nun (ml=5!): "Auto_".
- "unter" diesem Key werden alle Varianten als String erfaßt, also die 3 wie oben.
- der importierte Liste wird in "ml-Zeichen-Blöcken" durchsucht, und sobald so ein Teilstring im Dict. vorhanden ist, wird mit allen dort hinterlegten Varianten verglichen.
Beispiel: A2 = "Mein Auto_Benz fährt subba."
Vergleiche der Reihe nach: "Mein ", "ein A", "in Au", "n Aut", " Auto" und "Auto_" - was im Dict. steht; die drei im Dict gespeicherten Begriffe werden dann in A2 gesucht, und "Auto_Benz" wird als Treffer in Spalte B übernommen.
Zunächst hatte ich als Trennzeichen zwischen den Begriffen ein "|", was aber zu Fehlfunktionen führte, weil es auch im Text vorhanden war: deshalb der Um- bzw. Ausweg über chr(0): dafür gibt es kein Zeichen, also kann es grundsätzlich in *keinem* Text vorkommen.
So: mit 350 aus 3500 ML: paar Millisekunden; mit 1000 aus 35.000 wenig mehr; bei meiner Hardware weniger als 1/5 Sekunden.
Happy Exceling,
Michael (excelerated)
Anzeige
1 Sache noch zur Perfektion! ;)
20.01.2017 14:39:02
Nilo
HalliGalli,
das ist ja ein geniales Kontrukt, ohne Frage!
Ich weiß nicht ob ich das jetzt 100%ig erklären, ich versuchs mal:
die Datensätze in der Masterliste sind unterschiedlich lang und sollen auch nicht fix in der Länge sein! Je nachdem wie das Bauteil benannt wurde kann die Zeichenanzahl variieren (als Beispiel bei einfacher Erweiterung für neue Revisionen "11A11#111" ist alt und neu "11A11#111 rev.1.114")
Dein VBA läuft schnell und macht was es soll, es schreibt auf der Importseite aber auch Nummern rein die nicht in der Masterliste stehen, Quasi übernimmt er alles 1:1 mit Ausnahme der gefunden,
die stehen jetzt korrekt alleine in der Zelle!
Wenn auf der Importseite jetzt nur da angezeigt werden würde was er im Master gefunden hat, das wäre perfekt.
Vielen Dank für Deinen Support und Deine Zeit.
Gruß
Nilo
Anzeige
AW: 1 Sache noch zur Perfektion! ;)
20.01.2017 15:44:18
Michael
Hi Nilo,
ich bin mir nicht sicher, ob ich Dich jetzt richtig verstehe...
Es geht *nicht* um eine "fixe", sondern die minimale Zeichenlänge. Um die zu ermitteln, mußt Du schlimmstenfalls mal die Mastertabelle danach abgrasen, entweder mit VBA oder schlicht mit Formel in B2:B(ende): =länge(A2) und dann irgendwo, z.B. in C3: =min(B2:B(ende)), dann weißt Du's und kannst den Wert in die Const stecken.
Bei "11A11#111" ist alt und neu "11A11#111 rev.1.114" wird's "logisch" schwierig, wenn beide Begriffe in der Masterliste stehen: da wird eben der genommen, der mehr oder weniger zufällig als 1. drinsteht. Abhilfe wäre, die ML "absteigend" zu sortieren, dann kommt "11A11#111 rev.1.114" VOR "11A11#111".
So, ansonsten: "ertappt!" - meine Daten enthielten ALLE Teile aus der Masterliste, deshalb hatte ich das übersehen. Die mit *** markierte Zeile ist neu:
For i = 2 To UBound(b)
ok = False
lb = Len(b(i, 1))
For j = 1 To lb - ml
s = Mid(b(i, 1), j, ml)
If o.exists(s) Then
'  Stop
ois = Split(o(s), Chr(0))
For k = 1 To UBound(ois)
p = InStr(2, b(i, 1), ois(k), vbBinaryCompare)
If p > 0 Then b(i, 1) = ois(k): ok = True: Exit For
Next
End If
If ok Then Exit For
Next
If Not ok Then b(i, 1) = "" ' ***
Next

Falls nicht ok (also nicht gefunden) dann ="" (leer) oder nach Gusto "n.v." oder so.
Teste mal bitte...
Gruß,
Michael
Anzeige
Ja das funktioniert jetzt perfekt!
23.01.2017 16:02:46
Nilo
Hi Michael,
sorry für die späte Rückmeldung.
Habe den VBA Teil ersetzt und juhuu genau so läuft es wie geschmiert.
Ich lasse die Const ml = 0 einfach auf null. das dreht ein bisschen ist aber
sehr "Anwenderfreundlich" und kommt ohne Formeln aus.
Vielen lieben Dank für Deine Hilfe.
Beste Grüße
Nilo
AW: Ja das funktioniert jetzt perfekt!
24.01.2017 15:13:06
Michael
Hi Nilo,
das freut mich, allerdings ist mir mit ml=0 absolut unwohl: Du wirst in der Masterliste KEINE Begriffe mit einer Zeichenlänge von 0 haben! Ich habe die Stelle "markiert", bei der das wichtig ist.
Weiterhin habe ich eine Ermittlung der Längen eingebaut:
Sub vglWerte()
Dim a, b, c, lb&, i&, j&, k&, p&, s$, o As Object, oi, ois
Dim ok As Boolean
' ****** neu am 24.01.
Dim ml& ' minimale Länge in Masterliste, je höher, desto fixer
' ****** neu am 24.01.
Dim t0 As Single
t0 = Timer
Set o = CreateObject("scripting.dictionary")
a = Sheets("Masterliste").Range("A1").CurrentRegion
' Currentregion ist der "zusammenhängende Bereich", d.h., falls
' eine Zelle zwischendrin leer ist, wird der darunterliegende
' Teilbereich NICHT übernommen.
Sheets("Import").Range("B:B").ClearContents
b = Sheets("Import").Range("A1").CurrentRegion
c = Sheets("Import").Range("A1").CurrentRegion.Resize(, 2)
' ****** neu am 24.01. **********
' Das ist quasi ein "Präprozessor", der die minimale Länge ermittelt
ml = 1000
For i = 2 To UBound(a) ' ab 2 wegen Überschrift
If Len(a(i, 1))  0 Then b(i, 1) = ois(k): ok = True: c(i, 1) = p: c(i, 2) = Len(ois(k)): Exit For
Next
End If
If ok Then Exit For
Next
If Not ok Then b(i, 1) = "" ' ***
Next
Sheets("Import").Range("B1").Resize(UBound(b)) = b
Sheets("Import").Range("G5").Value = UBound(b) - 1 & " aus " & _
UBound(a) - 1 & " in " & (Timer - t0) * 1000 & " ms."
Sheets("Import").Range("C1").Resize(UBound(c), 2) = c
End Sub
Hm. Mit ml=0 bist Du im Prinzip genauso weit wie mit den Formeln: das Dictionary wird mit 0 quasi nicht benutzt...
Schöne Grüße,
Michael
Anzeige
Vielen Dank Michael! Werd mich da mal reindenken..
25.01.2017 16:02:54
Nilo
Beste Grüße,
Nilo
ok, viel Erfolg & Gruß, owT
25.01.2017 18:21:53
Michael

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige