
У меня есть ужасно отформатированный столбец, где каждая ячейка может содержать ноль или одну или несколько записей, как в следующем примере (в этом столбце их две):
ACTI-U-9754 - Some description MDCF-U-9791 - Some other description
Мне нужно извлечь 11 строк символов в отдельный столбец, желательно с формулой. Для ячейки выше это должно выглядеть так:
ACTI-U-9754
MDCF-U-9791
Я не нашел примеров, которые имели бы отношение к этому конкретному сценарию.
решение1
Боюсь, я не смог придумать простой метод формулы, однако, вот метод VBA с использованием RegEx, на случай, если он вам пригодится. Шаблон RegEx предполагает, что коды всегда будут одинаковыми, 4 letters
-
1 letter
-
4 digits
конечно, вы можете вносить изменения по мере необходимости. Если предположение о буквах и цифрах неверно, но формат всегда 4-1-4, вы можете использовать .{4}\-.\-.{4}
вместо этого:
Sub GetCodes()
Dim strPattern: strPattern = "\w{4}\-\w\-\d{4}" 'Pattern to match
Dim colNumber: colNumber = 1 'Column number containing strings (In this case, 1, for column A)
Dim rowCount: rowCount = 1 'Row number to start from
Range("B1").Select 'Cell to start new column from
'Create a new RegEx engine instance
Dim rgx: Set rgx = CreateObject("vbscript.regexp")
'Set out RegEx instance to allow Global (More than 1 result per text), MultiLine (Incase there are any carriage returns in the cell), IgnoreCase (Allow both upper and lowercase, which isn't needed with \w but included to be sure) and Pattern, the patter defined above.
With rgx
.Global = True
.MultiLine = True
.IgnoreCase = True
.Pattern = strPattern
End With
'Begin a loop that ends once we hit an empty cell
Do
'Get all our RegEx matches and store them in rgxMatches
Dim rgxMatches: Set rgxMatches = rgx.Execute(Cells(rowCount, colNumber).Value)
Dim rgxMatch
'Loop through our matches
For Each rgxMatch In rgxMatches
'Write the match into the active cell
ActiveCell.Value = rgxMatch.Value
'Go down one row, ready to write the next cell if there is one
ActiveCell.Offset(1, 0).Select
Next
'Increment our row count so the next loop uses the next row
rowCount = rowCount + 1
Loop Until IsEmpty(Cells(rowCount, colNumber))
'Clean up after
Set rgx = Nothing
Set rgxMatches = Nothing
End Sub