Сортировка алфавитов в слове / строке - PullRequest
0 голосов
/ 16 июня 2020

Есть ли в excel vba функция для сортировки заданного слова или строки по алфавиту? Кроме того, что такое манипуляции со строками, называемые в технических терминах / программировании?

For e.g. Word = "Somestring"
Output = "egimnorSst"

Спасибо.

Ответы [ 2 ]

3 голосов
/ 16 июня 2020

Если у вас есть Excel O365 с функциями, которые я использовал ниже, вы можете использовать эту формулу:

=TEXTJOIN(,,SORT(MID(A1,SEQUENCE(LEN(A1)),1)))

или, как указано @JvdV, вместо TEXTJOIN мы можем использовать более простую:

=CONCAT(SORT(MID(A1,SEQUENCE(LEN(A1)),1)))

enter image description here

Если у y0u нет этих функций, вам понадобится UDF, написанный на VBA.

Вот тот, который, поскольку строки сортировки должны быть относительно короткими, использует простую пузырьковую сортировку для сортировки элементов строки.

Option Explicit
Option Compare Text
Function sortString(S As String) As String
    Dim str() As String
    Dim I As Long

ReDim str(1 To Len(S))
For I = 1 To Len(S)
    str(I) = Mid(S, I, 1)
Next I

BubbleSort str

sortString = Join(str, "")

End Function

Sub BubbleSort(TempArray)
'copied directly from support.microsoft.com
    Dim temp As Variant
    Dim I As Integer
    Dim NoExchanges As Integer

    ' Loop until no more "exchanges" are made.
    Do
        NoExchanges = True

        ' Loop through each element in the array.
        For I = LBound(TempArray) To UBound(TempArray) - 1

            ' If the element is greater than the element
            ' following it, exchange the two elements.
            If TempArray(I) > TempArray(I + 1) Then
                NoExchanges = False
                temp = TempArray(I)
                TempArray(I) = TempArray(I + 1)
                TempArray(I + 1) = temp
            End If
        Next I
    Loop While Not (NoExchanges)
End Sub
3 голосов
/ 16 июня 2020

Хотя вопрос сам по себе минимальный, я все же хотел бы на него ответить. Если вы не позаботились о том, чтобы поменять местами S и s, чем:

Sub Test()

Dim x As Long
Dim str As String: str = "Somestring"

With CreateObject("System.Collections.ArrayList")
    For x = 1 To Len(str)
        .Add Mid(str, x, 1)
        .Sort
    Next
    Debug.Print Join(.Toarray, "")
End With

End Sub

Результатов будет:

egimnorsSt

Если это не то, что вы хотите, он станет немного более сложный, я думаю, поскольку мы не можем использовать коды ASCII (S = 83 и намного ниже, чем другие символы).

Это может быть не очень красиво, но попробуйте:

Sub Test()

Dim x As Long
Dim str As String, str_new As String

str = "abcdABCD"
With CreateObject("System.Collections.ArrayList")
    For x = 1 To Len(str)
        .Add Mid(str, x, 1)
        .Sort
    Next
    str_new = Join(.Toarray, "")
End With

With CreateObject("vbscript.regexp")
    .Global = True
    .IgnoreCase = True
    .Pattern = "([a-z])\1+"
    If .Test(str_new) Then
        For Each Match In .Execute(str_new)
            str_new = Replace(str_new, Match, Application.Proper(Match)) 'Assuming no more than 1 of the same uppercase letters.
        Next
    End If
End With
Debug.Print str_new

End Sub

Результаты in:

AaBbCcDd

Другой вариант, если у вас есть ExcelO365 с новыми DA-функциями и значением в A1:

=CONCAT(SORT(MID(A1,ROW(A1:INDEX(A:A,LEN(A1))),1)))

Это фактически вернет egimnorSst

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...