私はあなたがこれを行うには、いくつかの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の負荷も少なくなります。しかし、あなたがあまりにも多くの結果を得ており、これを外科医のようにする必要がある場合は、これが野球場に入るはずです。
このコードは本当にきれいです! .....................私はそれを自分で使うことができます。 –
ありがとう@ Garyのスチューデント私はまだこれを行うのが最善であるとは確信していません。それは確かにいくつかのリファクタリングのために熟している。 'strWordSeparators'を入力とする反復的な' replace() '関数ラッパーを試してみるかもしれません。もしそれが十分に速ければ、出力を 'split()'に渡すのはすばらしいことになります。というのも、単語の配列を反復するほうがはるかに速く、文字列になります。特に大きな文字列の場合。 – JNevill
私は同意しますが、投稿されたコードも非常に良いです –