В добавление того, что @RolandSmith написал, вот способ использования регулярных выражений в Excel - VBA
Option Explicit
Function ExtractSpecial(S As String, Index As Long) As String
Dim RE As Object, MC As Object
Const sPat As String = "([a-z]+)\s+(special)\s+([^a-z]+)"
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.ignorecase = True
.MultiLine = False
.Pattern = sPat
If .test(S) = True Then
Set MC = .Execute(S)
ExtractSpecial = MC(0).submatches(Index - 1)
End If
End With
End Function
Index
аргумент в этом UDF соответствует возврату либо 1-й, 2-й или 3-й submatch из коллекции матча, так что вы можете легко разделить исходную строку в трех ваших желаемых компонентов.
Поскольку вы пишете у вас есть «тысячи строк», вы можете предпочесть, чтобы запустить макрос. Макрос обрабатывает данные намного быстрее, но не динамически. Приведенный ниже макрос предполагает, что ваши исходные данные находятся в столбце A на Sheet2 и будут помещать результаты в столбцы C: E на том же рабочем листе. Вы можете легко изменить эти параметры:
Sub ExtractSpec()
Dim RE As Object, MC As Object
Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
Dim vSrc As Variant, vRes As Variant
Dim I As Long
Set wsSrc = Worksheets("sheet2")
Set wsRes = Worksheets("sheet2")
Set rRes = wsRes.Cells(1, 3)
With wsSrc
vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With
Set RE = CreateObject("vbscript.regexp")
With RE
.Global = True
.MultiLine = False
.ignorecase = True
.Pattern = "([a-z]+)\s+(special)\s+([^a-z]+)"
ReDim vRes(1 To UBound(vSrc), 1 To 3)
For I = 1 To UBound(vSrc)
If .test(vSrc(I, 1)) = True Then
Set MC = .Execute(vSrc(I, 1))
vRes(I, 1) = MC(0).submatches(0)
vRes(I, 2) = MC(0).submatches(1)
vRes(I, 3) = MC(0).submatches(2)
End If
Next I
End With
Set rRes = rRes.Resize(UBound(vRes, 1), UBound(vRes, 2))
With rRes
.EntireColumn.Clear
.Value = vRes
.EntireColumn.AutoFit
End With
End Sub
Это идеальное решение. Единственная проблема, с которой я сталкиваюсь, - это автоматическое преобразование некоторых чисел в Даты.Я пробовал предлагаемые методы [такие как установка столбца в текст], но все еще есть эта проблема. – KitKat
Я удалил .EntireColumn.Clear и это сработало! – KitKat
@KitKat Попробуйте обернуть MC (0) ... в функции CStr. Или добавить с одинарной кавычкой –