2016-11-14 9 views
0

Excelのテキストからトラッキング番号のリストを解析する必要があります。文字の位置は必ずしも同じではありません。例:Excelテキストから数値のリストを解析します(1つのセルからの複数の数値)

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! 

テキストの塊は1つのセルにあります。私はこのように見ているのいずれかである3つの別々の列または行に結果を希望:

706970554628、709970554631、706970594642

は常に追跡番号の同じ数があってはなりません。 1つのセルは6つあり、別のセルは6つあります。

ありがとうございました!

答えて

2

私はあなたがこれを行うには、いくつかのVBAを必要とすると思います。そしてそれは超シンプルなものになることはありません。 @ Garyの研究者は、大きな文字列から数値を取得する素晴らしい例を持っています。あなたのシナリオに特化したものが必要な場合は、単語単位で文字列を解析し、URLにトラッキング番号が付いた時点を把握する必要があります。トリックを行います以下のような

何か:最初に戻ります

=getTrackingNumber(A1, 1) 

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 

をあなたが持つ式としてワークシートにそれを使用することができますので、これは、UDFですセルA1で遭遇する追跡番号。結果として、式

=getTrackingNumber(A1, 2) 

は、第2の追跡番号を返すなどとなります。

これは、キャラクターによって大きな文字列の文字を解析し、それが進むにつれて意思決定を行うので、高速な機能にはなりません。 GaryのStudentの答えを実行可能なものに変えることができれば、大規模なデータの方がはるかに速く、CPUの負荷も少なくなります。しかし、あなたがあまりにも多くの結果を得ており、これを外科医のようにする必要がある場合は、これが野球場に入るはずです。

+0

このコードは本当にきれいです! .....................私はそれを自分で使うことができます。 –

+0

ありがとう@ Garyのスチューデント私はまだこれを行うのが最善であるとは確信していません。それは確かにいくつかのリファクタリングのために熟している。 'strWordSeparators'を入力とする反復的な' replace() '関数ラッパーを試してみるかもしれません。もしそれが十分に速ければ、出力を 'split()'に渡すのはすばらしいことになります。というのも、単語の配列を反復するほうがはるかに速く、文字列になります。特に大きな文字列の場合。 – JNevill

+0

私は同意しますが、投稿されたコードも非常に良いです –

1

追跡は常に桁、その後、セルの実行は、この短いマクロを実行する選択している場合:

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 

​​3210

関連する問題