【问题标题】:How to reverse comma separated string in Excel?如何在Excel中反转逗号分隔的字符串?
【发布时间】:2019-02-15 20:27:04
【问题描述】:

如何使用 MS Excel 中的公式来反转逗号分隔的字符串?值的数量并不总是相同,因此有些行有 3、4 个元素,有些只有一个元素。

所以输出如下图所示

【问题讨论】:

  • 你能举出更多例子吗? Apple,Orange,Grape 会返回什么?是Grape,Orange,Apple 还是eparG,egnarO,elppA
  • 可以使用宏吗?
  • 试试这个:=RIGHT(A1,LEN(A1)-FIND(” “,A1))&” “&LEFT(A1,FIND(” “,A1)-1)
  • @i_th 可行:1 如果只有两个单词,2 有空格分隔它们,在这种情况下都不是真的。

标签: excel excel-formula


【解决方案1】:

如果您有 Office 365 Excel,则使用此数组公式:

=TEXTJOIN(",",,TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),((LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1)-ROW($XFD$1:INDEX(XFD:XFD,LEN(A2)-LEN(SUBSTITUTE(A2,",",""))+1)))*99+1,99)))

作为数组公式,退出编辑模式时需要使用 Ctrl-Shift-Enter 确认,而不是 Enter。

如果没有 Office 365 Excel,那么 vba 可能是唯一的选择。

【讨论】:

  • @dwirony 嘘,别泄露我的秘密。很久以前,我把自己的灵魂卖给了 StackDevil。
  • 谢谢,但我得到了#NAME? 作为回报
  • @MonaCoder 那么您没有使用 Office 365 Excel,需要使用 dwirony 提供的 vba 代码。
  • @ScottCraner 世界上有什么。我退出了 excel。
  • @ScottCraner:很抱歉劫持了这个......丹尼斯(吉普车)发生了什么事。我问你是因为我相信他是你的好朋友?
【解决方案2】:

草率的UDF解决方案:

Function REVERSESTRING(original As Range, delim As String)

    Dim i As Long, reversed As String, arr As Variant

    arr = Split(original.Value, delim)

    For i = UBound(arr) To 0 Step -1
        reversed = reversed & arr(i) & ","
    Next i

    REVERSESTRING = Left(reversed, Len(reversed) - 1)

End Function

【讨论】:

  • 您好,但我收到了#NAME? 作为回报
  • @MonaCoder 你把代码放在模块里了吗?如果您将其放在ThisWorkbook 或工作表代码表中,则将找不到它。您需要将代码放在附加到工作簿的模块中。
  • 我实际上把代码放在Sheet1ThisWorkbook
  • 感谢添加到模块后现在得到它
【解决方案3】:

单单元格公式Excel 365中工作;使用该版本,不需要特殊的数组计算条目、VBscripts 或帮助列:


程序

在 Excel 中制作下表:

  1. 添加列标题

  2. 选择标题,然后按插入功能区选项卡上的表格图标

  3. 将下面的公式 1 和 2 复制到相应的列中

    
    Original |  #  |  Reversed
    ---------+-----+-----------
             | {1} |       {2}
    
  4. 将要反转的字符串放在第一列。


细节和定制

“原创”栏目

(保存您要处理的分隔字符串值)

将您的源数据放在此列中(如示例图像所示)

'#'列

(计算分隔单元格中的项目数)

注意:(此列完全可选;它只是显示原始列中的项目数)

{1}

=LET(
    existingDelimiter, ","
    , originalValue,   [@[Original]]
    , SUM(
        LEN(originalValue) 
        - LEN(
            SUBSTITUTE(
                originalValue
                , existingDelimiter
                , ""
            )
        )
    )
    +1
)

(注意:如果您的列表使用分隔符不是逗号,或者如果您的表格的第一列将有不同的名称,请使用为 公式#2如下。)

“反转”列

(颠倒列表中分隔项的顺序;可选择更改分隔符)

{2}

=LET(
    existingDelimiter, ","
    , newDelimiter,    ","
    , originalValue,   [@[Original]]
    , SUBSTITUTE(
        ARRAYTOTEXT(
            LET(
                list,
                    IFERROR(
                        FILTERXML(
                            "<t><s>"
                                & SUBSTITUTE(
                                    originalValue
                                    ,existingDelimiter
                                    ,"</s><s>"
                                )
                                & "</s></t>"
                            , "//s"
                        )
                        ,""
                    )
                ,SORTBY(
                    list,
                    SEQUENCE(
                        ROWS(list)
                        ,1
                        ,ROWS(list)
                        ,-1
                    )
                )
            )
            ,0
        )
        , ", "
        , newDelimiter
    )
)
  1. 根据需要通过更改 existingDelimiternewDelimiteroriginalValue 的值来调整您想要完成的公式。

    A.要反转逗号分隔的字符串,请使用以下公式:

       existingDelimiter, ","
       , newDelimiter,    ","
    
    1. 示例:

    B.要反转 DNS 名称,请将 existingDelimiternewDelimiter 定义中的逗号替换为句点:

       existingDelimiter, "."
       , newDelimiter,    "."
    
    1. 这对于reverse DNS names(又名Java 类名/Universal Type Indicators (UTIs)/等)非常有用
    2. 示例:
  2. [@[Original]] 中的“Original”替换为您的第一列的名称(如果不同)。

    A.如果仅使用单个单元格而不是表格列进行输入,请将 [@[Original]] 替换为对该单元格的引用(例如 B2):

      , originalValue,   B2
    1. 例子:

“反转”列公式说明:
  1. 通过手动转换成XML,我们可以使用FilterXML函数,将数据转换成数组
  2. 将数据保存在 array 中允许使用 SortBy 函数。
  3. SortBy 通过使用 Sequence 函数创建的帮助器 array 来反转 array
  4. 最后,ArrayToText 函数将这个(现在是反向排序的)array 转换回适合单个电子表格单元格的文本字符串。

这使我们不需要循环、辅助列或 VBScript。


奖励栏

要从列表中提取特定术语,请在另一个表列中使用以下公式:

  1. (将termNumber中的数字改成想要的值):

    =LET(
        existingDelimiter, ","
        , originalValue,   [@[Original]]
        , termNumber,      "[2]"
        , IFERROR(
            FILTERXML(
                "<t><s>"
            & SUBSTITUTE(
                originalValue
                , existingDelimiter
                , "</s><s>"
            )
            & "</s></t>"
            , "//s"
                & termNumber
            )
            , ""
        )
    )
    
  2. 例子:


其他说明

需要:

  • Excel 365(至少适用于 FilterXMLLet 函数,以及 动态数组)(*)
    • 它可能适用于其他版本,但我没有测试过。如果您发现其他或未来版本(例如 Excel 2022)可以使用此功能,请在 cmets 中注明。

不需要

  • 动态数组条目
  • VBscript
  • 启用宏的文件

(*) 这可以在 没有 Let 函数的情况下完成,但是使用 Let 可以减少编辑/重新调整计算用途的机会用户错误。

注意:当 Lambda 函数发布时(希望在 2021 年晚些时候) 然后这一切都可以包含在一个命名的工作表函数中

奖励:要使用代码突出显示编辑更复杂的 Excel 公式(以及自动意图和折叠等其他功能),请尝试使用带有 Swift 编程的文本编辑器语言支持。例子:

  1. VSCode editor (免费;跨平台)

    • 在有可用的 Excel 特定扩展之前,安装 Swift VSCode 扩展,例如:Swift language VSCode extension(提供代码突出显示和折叠似乎效果很好)
  2. Notepad++ (免费;仅限 Windows)

    • 从“语言”菜单中选择“Swift”

灵感来自(如果我忘记了某人,请道歉)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多