逆句序excel

emi*_*ilk 0 string excel vba reorderlist excel-formula

我只能找到反转单词的函数,例如 Hello -> olleH。但是,我需要一个将句子从最后到第一的顺序颠倒的函数。一个例子可能是:“你好,我的名字是”->“我的名字是你好”。

在 VBA 或预建函数中有什么建议吗?

谢谢

Jvd*_*vdV 6

使用 Excel 365,您可以尝试:

在此处输入图片说明

公式B1

=LET(X,FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s"),TEXTJOIN(" ",,SORTBY(X,SEQUENCE(COUNTA(X)),-1)))
Run Code Online (Sandbox Code Playgroud)

对于那些没有LET(),您可以尝试使用 Excel 2019:

=TEXTJOIN(" ",,INDEX(FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s"),N(IF(1,LEN(A1)-LEN(SUBSTITUTE(A1," ",""))+2-ROW(A1:INDEX(A:A,(LEN(A1)-LEN(SUBSTITUTE(A1," ","")))+1))))))
Run Code Online (Sandbox Code Playgroud)

显然,这需要您进行 CSE 输入公式。

  • 由于某种原因,我在 O365 中找不到“LET”函数。因此,作为我使用的解决方法, `=TEXTJOIN(" ",TRUE,INDEX(FILTERXML("&lt;t&gt;&lt;d&gt;"&amp;SUBSTITUTE(A2," ","&lt;/d&gt;&lt;d&gt;")&amp;"&lt;/d &gt;&lt;/t&gt;","//d"),ROWS($A$1:INDEX(A:A,COUNTA(FILTERXML("&lt;t&gt;&lt;d&gt;"&amp;SUBSTITUTE(A2," ","&lt;/d&gt;)) &lt;d&gt;")&amp;"&lt;/d&gt;&lt;/t&gt;","//d"))))-(ROW($A$1:INDEX(A:A,COUNTA(FILTERXML("&lt;t&gt;&lt;d) &gt;"&amp;SUBSTITUTE(A2," ","&lt;/d&gt;&lt;d&gt;")&amp;"&lt;/d&gt;&lt;/t&gt;","//d"))))-1)))` 这并不是真正的正如您发布的公式一样优雅! (2认同)

Sid*_*out 6

非常感谢,最好的功能是我可以在其他功能中控制... – emilk 36 分钟前

这是您可以传递具有值的范围的替代方法。

Option Explicit

Sub Sample()
    MsgBox ReverseString(Range("A1"))
End Sub
    
Private Function ReverseString(rng As Range) As String
    On Error GoTo Whoa
    
    Dim MyAr As Variant, itm As Variant
    
    MyAr = Split(rng.Value2, " ")
    
    Dim arListCollection As Object
    
    Set arListCollection = CreateObject("System.Collections.ArrayList")
    
    With arListCollection
        For Each itm In MyAr: .Add itm: Next itm
        .Reverse
        MyAr = .Toarray
    End With
    
    ReverseString = Join(MyAr, " ")
LetsContinue:
    Exit Function
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Function
Run Code Online (Sandbox Code Playgroud)

例如,如果要将字符串传递给函数

Sub Sample()
    MsgBox ReverseString("Hello my name is")
End Sub
Run Code Online (Sandbox Code Playgroud)

那么函数就变成了

Private Function ReverseString(s As String) As String
    On Error GoTo Whoa
    
    Dim MyAr As Variant, itm As Variant
    
    MyAr = Split(s, " ")
    
    Dim arListCollection As Object
    
    Set arListCollection = CreateObject("System.Collections.ArrayList")
    
    With arListCollection
        For Each itm In MyAr: .Add itm: Next itm
        .Reverse
        MyAr = .Toarray
    End With
    
    ReverseString = Join(MyAr, " ")
LetsContinue:
    Exit Function
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Function
Run Code Online (Sandbox Code Playgroud)

有趣的阅​​读: VBA ArrayList 快速指南