UDF ниже будет делать то, что вы хотите. Назовите это с листа как =InexMatch(A2)
. Убедитесь, что для ячейки, в которую вы ее поместили, свойство WrapText
имеет значение True.
Function InexMatch(Cell As Range) As String
' 003
Dim Arr As Variant
Dim Sp() As String
Dim Tmp As String
Dim Done As Boolean
Dim i As Integer
Arr = Split(Cell.Value, Chr(10))
For i = 0 To UBound(Arr)
Sp = Split(Arr(i), "-")
Arr(i) = Sp(1) & "-" & Sp(0)
Next i
Do
Done = True
For i = 0 To UBound(Arr) - 1
If Val(Arr(i + 1)) < Val(Arr(i)) Then
Tmp = Arr(i)
Arr(i) = Arr(i + 1)
Arr(i + 1) = Tmp
Done = False
End If
Next i
Loop While Not Done
On Error Resume Next
ReDim Sp(UBound(Arr))
For i = 0 To UBound(Arr)
Sp(i) = Split(Arr(i), "-")(1)
Next i
InexMatch = Join(Sp, Chr(10))
End Function
Функция вернет пустую строку, если указанная ячейка пуста. Это может иметь дело с клетками, которые имеют менее 4 строк. Он потерпит неудачу, если CR не ANSII Chr (10) или da sh не ANSII Chr (45) - знак минус. В нем не предусмотрены неполные строки в ячейках, то есть строки, которые не имеют символов с обеих сторон от da sh.
Чтобы восстановить исходный формат в отсортированной строке, удалите все строки под концом Do L oop в приведенном выше коде, начиная с On Error Resume Next
, и замените их следующим:
For i = 0 To UBound(Arr)
Sp = Split(Arr(i), "-")
Arr(i) = Sp(1) & "-" & Sp(0)
Next i
InexMatchV2 = Join(Arr, Chr(10))