私はこのように文字列を持っています
"東京からの車 5 33:53:03 時間に到着 13:56:39 オーストリアからの車 5 33:53:07 時間に到着 13:56:43 にインドからの車 5時間 13:56:39"
エクセルの同じセル。
文字列のこれらの部分をat 13:56:39
at 13:56:43
13:56:39
別々のセルに表示する必要があります。
助けてください
式を使用して、別のアプローチがあります。
列 B は次の式を使用します。
B1=IFERROR(SEARCH("at ??:??:??",A$1,1),"")
B2=IFERROR(SEARCH("at ??:??:??",A$1,B1+11),"")
列 C は次の式を使用します。
C1=IFERROR(PART(A$1,B1,11),"")
これらは、多数のオカレンスに対して機能します。
データが単一の列にある場合Regexp
、バリアント配列を使用するのが理にかなっていると思います。
しかし、より柔軟なオプションとして、次の UDF を配列として使用できます - 入力された式で文字列を分割します
文字列が say in でA1
、最大 5 つの一致が予想される場合
余分な不一致には #N/A が付きます
コード
updated to handle single matches
Function AtTime(strIN As String) As Variant
Dim objRegex As Object
Dim objRMC As Object
Dim strOut() As String
Dim lngCnt As Long
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Global = True
.Pattern = "at \d{2}:\d{2}:\d{2}"
If .test(strIN) Then
Set objRMC = .Execute(strIN)
If objRMC.Count > 1 Then
ReDim strOut(1 To objRMC.Count)
For lnGCnt = 1 To UBound(strOut)
strOut(lnGCnt) = objRMC(lnGCnt - 1)
Next
Else
'handle single matches
ReDim strOut(1 To 2)
strOut(1) = objRMC(0).Value
strOut(2) = "#N/A"
End If
AtTime = strOut
Else
AtTime = "no match"
End If
End With
End Function
ダウンおよびダーティな文字列操作:
Option Explicit
Sub Test()
Dim cellValue As String
Dim newCellArray() As String
Dim valueYouWant As String
Dim cellCounter As Integer
Dim x As Integer
Dim myRange As Range
Const SEPERATOR_VALUE = "at "
Const ASCII_A = 65
For cellCounter = 1 To 10 '10 represents the last row...there are ways to set this dynamically if needed
cellValue = Sheet1.Range("A" & cellCounter)
newCellArray = Split(cellValue, "at ")
'Array is zero-based, but we want to start at first split value
For x = 1 To UBound(newCellArray)
valueYouWant = Trim$(Left$(newCellArray(x), InStr(1, newCellArray(x), " "))) 'You could prefix this with "at " if you really needed it
Sheet1.Range(Chr$(ASCII_A + x) & cellCounter).Value = valueYouWant
Next x
Next cellCounter
End Sub