2016-04-26 16 views
0

Ich muss alle Instanzen von bestimmten Bezeichner finden, die in einer Spalte auftreten und sie zu einer Zeichenfolge verketten.Excel: Alle Instanzen von Text-Strings im Bereich finden und jede Instanz zurückgeben

Der Bezeichner wird mit "ECP" beginnen und durch einen Bindestrich oder ein Leerzeichen getrennt sein und nach dem Trennzeichen mehrere Zeichen haben. Z.B. "ECP 05-00012A1, "ECP-123456."

Ich verwendete die unten stehende Formel, dachte aber nicht an mehrere "ECP-Nummern".

=INDEX('Raw WAM Data'!$A$1:$A$10000,MATCH(VLOOKUP("*"&"ECP"&"*",'Raw WAM Data'!$A$1:$A$10000,1,FALSE),'Raw WAM Data'!$A$1:$A$10000,0))

I wurde dann Analysieren der Daten in einer benachbarten Zelle verwendet: =LEFT($C$62,FIND(" ", $C$62, FIND(" ", $C$62)+1)) Diese Zeichenkette dann in ein Benutzerformular TextBox geladen wurde.

Ich müsste dann alle zurückgegebenen Werte in eine Zeichenfolge durch Kommata getrennt verketten, so dass es in die UserForm TextBox geladen werden kann.

Ich würde denken, dass VBA wäre ideal dafür, aber ich bin offen für alle Vorschläge.

+0

Sie könnten ein Array verwenden und kommen in VBA.Sind Sie mit Ihrer Extraktion der Daten zufrieden, ist es unklar, was Sie wollen, die Extraktion von Daten, oder wie Sie effektiv verketten –

Antwort

1

Wenn ich richtige Verständnis haben, was Sie Sie können dann achive versuchen, etwas wie folgt verwenden:

Sub TEST() 
    Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary") 
    Dim cl As Range, x& 
    With Sheets("Sheet1") 'replace sheet1 by name of your sheet 
     x = .Cells(Rows.Count, "A").End(xlUp).Row 
     For Each cl In .Range(.[A1], .Cells(x, "A")) 
      If UCase(cl.Value2) Like "ECP*" And Not dic.exists(cl.Value2) Then 
       dic.Add cl.Value2, Nothing 
      End If 
     Next cl 
    End With 
    Debug.Print Join(dic.keys, Chr(10)) 
End Sub 

Test

enter image description here


Aktualisiert

Was ist der beste Weg, um die Ergebnisse in Spalte E relativ zu der Zelle, in der sie gefunden wurde, zu setzen? Wenn ich mehrere Spalten durchsuchen möchte, wie sollte ich den Code anpassen?

Sie auf diese Weise verwenden können:

Sub TEST2() 
    Dim cl As Range, x& 
    With Sheets("Sheet1") 'replace sheet1 by name of your sheet 
     x = .[A:C].Find("*", , , , xlByRows, xlPrevious).Row 'get the last used row in range 
     For Each cl In .Range(.[A1], .Cells(x, "C")) 
      If UCase(cl.Value2) Like "*ECP*" Then 
       If .Cells(cl.Row, "E").Value2 = "" Then 
        .Cells(cl.Row, "E").Value2 = cl.Value2 
       Else 
        .Cells(cl.Row, "E").Value2 = .Cells(cl.Row, "E").Value2 & "; " & cl.Value2 
       End If 
      End If 
     Next cl 
    End With 
End Sub 

Ausgabe

enter image description here

+0

Ich habe diesen Code ausgeführt, aber nichts passiert ist . Ich habe auch keine Fehler bekommen. – Adavid02

+0

Mit diesem Code wird das Ergebnis in das 'unmittelbare Fenster' gedruckt, mit 'Strg + G' wird dieses Fenster aktiviert. Sehen Sie im Screenshot das Datenbeispiel "rot markiert" und das Ergebnis auch "rot markiert". Der ausgegebene Code ist in Ordnung, und die Ausgabe geht zu 'unmittelbares Fenster', weil Sie nicht angegeben haben, wohin das Ausgabeergebnis gehen soll (z.B. zu einem neuen Blatt oder zu einer Spalte eines existierenden Blattes und so weiter). – Vasily

+0

Immer noch nichts und ich weiß es gibt "ECP" -Werte im Bereich. – Adavid02

0

Wenn sich Ihre Werte in Spalte A eines Arbeitsblatts befinden, sammelt diese Routine Ihre ECP-Nummern und lädt sie in ein Array. Sie können das Array dann in Ihre TextBox laden.

Sub GatherECPs() 

Dim ECParr 

'Loop down each row starting at row 2 (assuming you have headers) 
For x = 2 To SourceSheet.Range("A2").End(xlDown).Row 
    'Check if the start of the string is ECP 
    If Left(SourceSheet.Cells(x, 1).Value, 3) = "ECP" Then 
     'Add a row to the array 
     If IsEmpty(ECParr) Then 
      ReDim ECParr(0) 
     Else 
      ReDim Preserve ECParr(UBound(ECParr) + 1) 
     End If 
     'Add the value to the array 
     ECParr(UBound(ECParr)) = Right(SourceSheet.Cells(x, 1).Value, Len(SourceSheet.Cells(x, 1).Value) - 4) 
    End If 
Next 

End Sub 

ersetzen SourceSheet mit dem Blatt, wo Ihre Werte vorhanden sind.

+0

Wenn ich 'Debug.Print ECParr' Ich sehe keine Ergebnisse – Adavid02

0

es auf eine schnelle Art und Weise zu tun, die auch für mehrere "ECP" in einer Zelle funktioniert Verwenden Sie diese Funktion:

Public Function getStr(rng As Range, ident As String) As String 
    Dim i As Long, x As Variant, y As Variant 
    For Each x In Intersect(rng, rng.Parent.UsedRange).Value 
    y = Split(x, ident) 
    If UBound(y) > 0 Then 
     For i = 1 To UBound(y) 
     getStr = getStr & ", " & ident & Split(y(i), ",")(0) 
     Next 
    End If 
    Next 
    getStr = Mid(getStr, 3) 
End Function 

Es wird eine durch Kommas getrennte Zeichenfolge zurückgegeben. es einfach verwenden, wie: getStr(Range("A:A"), "ECP")

Wenn Sie noch Fragen haben, fragen Sie einfach;)

+0

Was ist der beste Weg, um das Ergebnis an eine bestimmte Spalte (Spalte E) der gleichen Zeile zu übergeben, in der der Wert gefunden wurde? – Adavid02

+0

Als UDF können Sie E1 '= getStr (A1," ECP ")' eingeben und dann runterkopieren. Sollte es so machen, wie du es willst ... –