Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo, und hier eine andere Variante: Code: Sub suche2() Dim lngZ As Long, i As Long Dim Zelle As Range Dim rngFound As Range lngZ = Cells(Rows.Count, 3).End(xlUp).Row Application.ScreenUpdating = False Range("E2:E" & lngZ).ClearContents For Each Zelle In Range("Tabelle6") If Zelle <> "" Then Set rngFound = Range("C1:C" & lngZ).Find(Zelle, lookat:=xlPart) If Not rngFound Is Nothing Then Cells(rngFound.Row, 5) = Cells(Zelle.Row, 7) End If End If Next Zelle Application.ScreenUpdating = True End Sub
Hier wird jeder Wert aus Tabelle2 in Spalte C der Tabelle1 gesucht. Der Suchwert wird in Teilen des Strings der Spalte c gesucht. Der Suchwert kann als an beliebiger Stelle (am Anfang, mittendrin oder auch am Ende) des Strings stehen.
Gruß Atilla
Registriert seit: 12.01.2016
Version(en): 2013
(13.01.2016, 11:54)radagast schrieb: heje excelfreunde,
(1)
eine bitte an brinkhoff: definiere konstruktiv den stringaufbau in spalte "C". in deiner tabelle findet man:
zeile1 = FSM => FSM = textteil1 und keine weiteren textteile (Länge 3 Zeichen) zeile2 = Text 1 => Text 1 = Textteil1 und keine weiteren textteile (Länge 5 Zeichen) oder zeile2 = Text 1 => Text = Textteil1, Leerzeichen = Textteil2, 1 =Textteil3 (Länge 5 Zeichen) zeile3 = FSR 125 X 500 MM. ist hier FSR = Textteil1 oder oder oder
im moment sehe ich es so, dass die strings in spalte "C" aus Textteil(1) bis Texteil(n) mit leerzeichen bestehen und "scheinbar" nur der erste textteil = textteil 1 = FSR oder FSM aus drei zeichen bestehen. hier ist es nötig, dass brinkhoff die genaue struktur der strings aus spalte "C" liefert und erläutert.
(2)
in zeile 1 steht in spalte "C" = FSM und in den Spalten "G" = FSR, "H" = FSM und "I" = Test 1. da nach brinkhoff spalte "C" mit den spalten "G" bis "M" abgeglichen werden soll, frage ich mich was soll in spalte "E" stehen, denn man findet in tabelle2/zeile1 mindesten zwei richtige antworten, aber welche davon gilt !!!!!! und bei vergleich über die gesamte tabelle2 werden sicherlich n lösungen existieren (siehe hierzu zeile 1 aus tabelle2)
(3)
gedankenexperiment:
nehme tabelle1 / spalte "C" / zeile(n) und vergleiche mit tabelle2/ Spalte "H" bis "M" / zeile(n), wenn in zeile(n) textteil(1) in "H" bis "M" vorhanden (achtung, mehre lösungen möglich), dann nehme inhalte von "G" / zeile(n) und schreibe nach "E" / zeile (n).
hier ist brinkhoff gefordert, genau mitzuteilen (dezidierter tabellenausschnitt), so das man in der formelei weiter kommt Hallo Janosch, Zu 1: der Stringaufbau in "C" ist leider nicht immer gleich. Aber ich bin meine Daten gerade so weit durch gegangen, dass man von folgendem Aufbau ausgehen kann: Es soll immer nach den ersten 3 Zeichen gesucht werden. Es folgt nicht immer ein Leerzeichen und es sind teilweise Zeichen vorgesetzt. Die Anzahl der "Ausnahmen" ist jedoch überschaubar und in wenigen Tagen manuell abgearbeitet. Zu 2: Es gibt in Tabelle 2 keine doppelten Werte. Jeder Zellwert ist einmalig in Tabelle 2 vorhanden. Zu 3: Deine Formulierung trifft es genau. (soweit ich das als Laie beurteilen kann)
Registriert seit: 12.01.2016
Version(en): 2013
(13.01.2016, 11:57)atilla schrieb: Hallo,
unten ein Code, der das macht, was ich in meiner letzten Einlassung beschrieben habe:
Code: Option Explicit
Sub suche() Dim lngZ As Long, i As Long Dim rngFound As Range lngZ = Cells(Rows.Count, 3).End(xlUp).Row Application.ScreenUpdating = False Range("E2:E" & lngZ).ClearContents For i = 2 To lngZ If Cells(i, 3) <> "" Then Set rngFound = Range("Tabelle6").Find(Cells(i, 3), lookat:=xlWhole) If Not rngFound Is Nothing Then Cells(i, 5) = Cells(rngFound.Row, 7) Else If UBound(Split(Cells(i, 3))) > 1 Then Set rngFound = Range("Tabelle6").Find(Split(Cells(i, 3))(0), lookat:=xlWhole) If Not rngFound Is Nothing Then Cells(i, 5) = Cells(rngFound.Row, 7) End If End If End If End If Next i Application.ScreenUpdating = True End Sub
Bitte teste den Code in einer Kopie Deiner Datei! Atilla, der erste Code funktioniert solange der String alleine steht. Wenn direkt darauf etwas folgt nimmt er es nicht mehr an. Beispiel FSR 250W geht, FSR/2 250W geht nicht. Ich probier den anderen Code...
Registriert seit: 12.01.2016
Version(en): 2013
(13.01.2016, 12:13)atilla schrieb: Hallo,
und hier eine andere Variante:
Code: Sub suche2() Dim lngZ As Long, i As Long Dim Zelle As Range Dim rngFound As Range lngZ = Cells(Rows.Count, 3).End(xlUp).Row Application.ScreenUpdating = False Range("E2:E" & lngZ).ClearContents For Each Zelle In Range("Tabelle6") If Zelle <> "" Then Set rngFound = Range("C1:C" & lngZ).Find(Zelle, lookat:=xlPart) If Not rngFound Is Nothing Then Cells(rngFound.Row, 5) = Cells(Zelle.Row, 7) End If End If Next Zelle Application.ScreenUpdating = True End Sub
Hier wird jeder Wert aus Tabelle2 in Spalte C der Tabelle1 gesucht. Der Suchwert wird in Teilen des Strings der Spalte c gesucht. Der Suchwert kann als an beliebiger Stelle (am Anfang, mittendrin oder auch am Ende) des Strings stehen. Hier hört er bei der ersten Wiederholung in "C" auf. Sobald er etwas 2 mal findet schreibt er nicht mehr weiter. Habe es gegen getestet und einen Wert verändert. Er schreibt dann immer eine Zeile weiter bis er etwas 2 mal gefunden hat.
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo, ok, muss mit FindNext arbeiten. Teste mal: Code: Sub suche2() Dim lngZ As Long, i As Long Dim Zelle As Range Dim rngFound As Range Dim firstAddress As String lngZ = Cells(Rows.Count, 3).End(xlUp).Row Application.ScreenUpdating = False Range("E2:E" & lngZ).ClearContents For Each Zelle In Range("Tabelle6") If Zelle <> "" Then With Range("C1:C" & lngZ) Set rngFound = .Find(Zelle, lookat:=xlPart) If Not rngFound Is Nothing Then firstAddress = rngFound.Address Cells(rngFound.Row, 5) = Cells(Zelle.Row, 7) Do Set rngFound = .FindNext(rngFound) If Not rngFound Is Nothing Then Cells(rngFound.Row, 5) = Cells(Zelle.Row, 7) End If Loop While Not rngFound Is Nothing And rngFound.Address <> firstAddress End If End With End If Next Zelle Application.ScreenUpdating = True End Sub
Gruß Atilla
Registriert seit: 15.04.2014
Version(en): 2007, 2010, 2019
heje excelfreunde,
fasse brinkhoff's aussagen zusammen:
tabelle1 / spalte "C" => string = FSM oder FSR 125 X 500 MM oder *#FSR 125 X 500 MM oder *#FSR125X500MM. fazit, brinkhoff benötigt eine hilfspalte, die exakt alle suchparameter enthält. die kann dann zum vergleichen string in spalte "C" mit hilfsspalte herangezogen werden. oooooder, ich vermute, hoffe, dass eventuell tabelle2 / spalte "G" genau die suchparameter enthält.
gedankenexperiment_2:
nehme string aus tabelle1 / spalte "C" / zeile(n) und vergleiche tabelle2 / spalte "G" / Zeile(1 bis k), ob string aus tabelle1 / spalte "C" / zeile(n) eine textteil aus tabelle2 / spalte"G2" / zeile(K) enthält, wenn nein dann Tabelle1 / spalte "E" / zeile(n) nichts eintragen. ansonst, merke dir zeile(k), welche den übereinstimmenden textteil enthält. dann suche in tabelle2/ Spalte "H" bis "M" / zeile(k) eine textteil der mit textteil in string aus tabelle1 / spalte "C" / zeile(n) übereinstimmt, wenn nein, dann Tabelle1 / spalte "E" / zeile(n) nichts eintragen, ansonst nehme inhalte von "G" / zeile(k) und schreibe nach "E" / zeile (n).
Vielen Dank --Janosch Excel 2019 (64bit) Win 10 Pro (64bit)
Registriert seit: 12.01.2016
Version(en): 2013
(13.01.2016, 13:34)atilla schrieb: Hallo,
ok, muss mit FindNext arbeiten. Teste mal:
Code: Sub suche2() Dim lngZ As Long, i As Long Dim Zelle As Range Dim rngFound As Range Dim firstAddress As String lngZ = Cells(Rows.Count, 3).End(xlUp).Row Application.ScreenUpdating = False Range("E2:E" & lngZ).ClearContents For Each Zelle In Range("Tabelle6") If Zelle <> "" Then With Range("C1:C" & lngZ) Set rngFound = .Find(Zelle, lookat:=xlPart) If Not rngFound Is Nothing Then firstAddress = rngFound.Address Cells(rngFound.Row, 5) = Cells(Zelle.Row, 7) Do Set rngFound = .FindNext(rngFound) If Not rngFound Is Nothing Then Cells(rngFound.Row, 5) = Cells(Zelle.Row, 7) End If Loop While Not rngFound Is Nothing And rngFound.Address <> firstAddress End If End With End If Next Zelle Application.ScreenUpdating = True End Sub
Das klappt!! Ich teste nochmal durch aber bisher sind alle Werte aus der Tabelle eingetragen. Sogar die 2Stelligen die ich grad als Test hinzu gefügt habe. Echt klasse! Sag mal um sowas selbst hin zu kriegen muss ich mindestens nen VB Kurs machen oder?!
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo,
nee, ich habe mir das selber beigebracht. Meist durch nachstellen und rekapitulieren von solchen Aufgaben hier im Forum.
Gruß Atilla
Registriert seit: 15.04.2014
Version(en): 2007, 2010, 2019
heje excelfreunde,
ergänzung zur vorherigen einlassung. ich vermute(siehe auch spaltenüberschriften tabelle2), dass in tabelle2 / Spalte "G" die suchparameter enthalten sind, welche im string tabelle1 / spalte "C" / zeile(n) zu suchen sind. wenn das zutrifft, dann dürfen nur noch in den spalten "H" bis "M" / zeile(k) übereinstimmungen gesucht werden. würde man in die suche auch die spalte "G" mit einbinden, dann bräuchten die anderen spalten nicht durchsucht werden, da in spalte "G" schon einmal ein textteil enthalten ist.
Vielen Dank --Janosch Excel 2019 (64bit) Win 10 Pro (64bit)
Registriert seit: 12.01.2016
Version(en): 2013
(13.01.2016, 14:59)radagast schrieb: heje excelfreunde,
ergänzung zur vorherigen einlassung. ich vermute(siehe auch spaltenüberschriften tabelle2), dass in tabelle2 / Spalte "G" die suchparameter enthalten sind, welche im string tabelle1 / spalte "C" / zeile(n) zu suchen sind. wenn das zutrifft, dann dürfen nur noch in den spalten "H" bis "M" / zeile(k) übereinstimmungen gesucht werden. würde man in die suche auch die spalte "G" mit einbinden, dann bräuchten die anderen spalten nicht durchsucht werden, da in spalte "G" schon einmal ein textteil enthalten ist. Hey Janosch, "G" muss mit in die Suche eingebunden werden, da es den ersten Suchbegriff enthält. Dieser ist gleichzeitig dann der Begriff der auf "E" übertragen werden soll. Allerdings hat Atilla das ganze schon mit VBA gelöst. Falls du noch eine Formel suchen willst mit der andere Nutzer eine ähnliche Problematik ohne VBA lösen wollen sag ich nicht nein. Ich lass dir den Tröt hier noch offen. Aber für mich ist mein Problem erledigt. Danke an alle für die Hilfe.
|