Suchen und Sortieren
#21
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
Top
#22
(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)
Top
#23
(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...
Top
#24
(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.
Top
#25
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
Top
#26
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)                              
Top
#27
(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?!
Top
#28
Hallo,

nee, ich habe mir das selber beigebracht.
Meist durch nachstellen und rekapitulieren von solchen Aufgaben hier im Forum.
Gruß Atilla
Top
#29
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)                              
Top
#30
(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.
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste