2016-11-14 4 views
0

Ich muss eine Liste von Tracking-Nummern aus dem Text in Excel analysieren. Die Position in Bezug auf Zeichen wird nicht immer dieselbe sein. Ein Beispiel:Excel Parsen Sie eine Liste von Zahlen aus dem Text (mehrere Zahlen aus einer Zelle)

Location ID 987 

Your package is arriving 01/01/2015 

Fruit Snacks 706970554628 
<http://www.fedex. com/Tracking?tracknumbers=706970554628> 

Olive Oil 709970554631 
<http://www.fedex. com/Tracking?tracknumbers=709970554631> 

Sign 706970594642 
<http://www.fedex .com/Tracking?tracknumbers=706970594642> 

Thank you for shopping with us! 

Der Textblock befindet sich in einer Zelle. Ich möchte die Ergebnisse entweder 3 separate Spalten oder Zeilen wie folgt aussehen:

706970554628, 709970554631, 706970594642

Es wird die gleiche Anzahl von Tracking-Nummern nicht immer sein. Eine Zelle könnte sechs haben, während eine andere eine hat.

Vielen Dank für jede Hilfe !!

Antwort

2

Ich denke, Sie werden einige VBA müssen dies tun, . Und es wird kein super einfaches Zeug sein. @ Gary'sStudent hat ein großartiges Beispiel dafür, wie man Zahlen von einer großen Zeichenkette ergreift. Wenn Sie etwas benötigen, das für Ihr Szenario spezifischer ist, müssen Sie die Zeichenfolge Wort für Wort syntaktisch analysieren und herausfinden, ob sie in der URL auf eine Verfolgungsnummer trifft.

etwa wie folgt den Trick:

Function getTrackingNumber(bigMessage As String, numberPosition As Integer) As String 
    Dim intStrPos As Integer 
    Dim arrTrackNumbers() As Variant 

    'create a variable to hold characters we'll use to identify words 
    Dim strWorkSeparators As String 
    strWordSeparators = "()=/<>?. " & vbCrLf 


    'iterate through each character in the big message 
    For intStrPos = 1 To Len(bigMessage) 

     'Identify distinct words 
     If InStr(1, strWordSeparators, Mid(bigMessage, intStrPos, 1)) > 1 Then 'we found the start of a new word 

      'if foundTrackNumber is true, then this must be a tracking number. Add it to the array of tracking numbers 
      If foundTrackNumber Then 
       'keep track of how many we've found 
       trackNumbersFound = trackNumbersFound + 1 

       'redim the array in which we are holding the track numbers 
       ReDim Preserve arrTrackNumbers(0 To trackNumbersFound - 1) 

       'add the track 
       arrTrackNumbers(trackNumbersFound - 1) = strword 
      End If 

      'Check to see if the word that we just grabbed is "tracknumber" 
      If strword = "tracknumbers" Then 
       foundTrackNumber = True 
      Else 
       foundTrackNumber = False 
      End If 

      'set this back to nothing 
      strword = "" 
     Else 
      strword = strword + Mid(bigMessage, intStrPos, 1) 
     End If 
    Next intStrPos 

    'return the requested tracking number if it exists. 
    If numberPosition > UBound(arrTrackNumbers) + 1 Then 
     getTrackingNumber = "" 
    Else 
     getTrackingNumber = arrTrackNumbers(numberPosition - 1) 
    End If 

End Function 

Dies ist ein UDF, so dass Sie es in Ihrem Arbeitsblatt als Formel mit verwenden können:

=getTrackingNumber(A1, 1) 

, die die erste zurück Tracking-Nummer, die es in Zelle A1 trifft. Folglich wird die Formel

die zweite Verfolgungsnummer usw. zurückgeben.

Dies wird jedoch keine schnelle Funktion sein, da es die große Zeichenfolge Zeichen für Zeichen analysiert und Entscheidungen trifft. Wenn Sie die Antwort von Gary's Student in etwas Umsetzbares streiten können, ist es bei größeren Daten viel schneller und weniger CPU-intensiv. Wenn Sie jedoch zu viele Ergebnisse bekommen und dies wie ein Chirurg tun müssen, dann sollte dies Sie in den Ballpark bringen.

+0

Dieser Code ist wirklich ordentlich! ..................... Ich kann es selbst benutzen. –

+0

Danke @ Gary'sStudent Ich bin immer noch nicht überzeugt, dass dies das Beste ist. Es ist definitiv reif für ein Refactoring. Ich könnte mit einem iterativen 'replace()' -Funktionswrapper basteln, der 'strWordSeparators' als Eingabe nimmt. Wenn das schnell genug ist, wäre es toll, die Ausgabe an 'split()' zu übergeben, da es viel schneller wäre, ein Array von Wörtern zu iterieren, als es eine Zeichenkette wäre. Speziell für große eingehende Saiten. – JNevill

+0

Ich stimme zu, aber auch der Code ist sehr gut gepostet –

1

Wenn Tracking ist immer ein Ziffer Nummer, dann wählen Sie die Zelle laufen laufen diese kurze Makro:

Sub parser117() 
    Dim s As String, ary, i As Long 
    With ActiveCell 
     ary = Split(Replace(Replace(.Text, Chr(10), " "), Chr(13), " "), " ") 
     i = 1 
     For Each a In ary 
      If Len(a) = 12 And IsNumeric(a) Then 
       .Offset(0, i).Value = a 
       i = i + 1 
      End If 
     Next a 
    End With 
End Sub 

enter image description here

Verwandte Themen