在Excel 2010中用逗号分隔单词

在Excel 2010中用逗号分隔单词,excel,excel-formula,excel-2010,Excel,Excel Formula,Excel 2010,我正在尝试使用Excel中的一个公式,用逗号分隔单元格中的一组单词。如果单元格中有超过5个单词,我只想得到前5个单词。要获取单元格中的前五个单词并用逗号分隔,我使用以下命令: =SUBSTITUTE(LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",5))-1), " ", ", ") 这个很好用。但问题是,因为这里的数字是5,如果一个单元格包含少于5个单词,我会得到一个错误。我试图用以下内容替换5: LEN(TRIM(A1))-LEN(SUBSTITUTE(A1,

我正在尝试使用Excel中的一个公式,用逗号分隔单元格中的一组单词。如果单元格中有超过5个单词,我只想得到前5个单词。要获取单元格中的前五个单词并用逗号分隔,我使用以下命令:

=SUBSTITUTE(LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",5))-1), " ", ", ")
这个很好用。但问题是,因为这里的数字是5,如果一个单元格包含少于5个单词,我会得到一个错误。我试图用以下内容替换5:

LEN(TRIM(A1))-LEN(SUBSTITUTE(A1," ",""))+1
所以我的功能变成:

=SUBSTITUTE(LEFT(A1,FIND("^",SUBSTITUTE(A1," ","^",LEN(TRIM(A1))-LEN(SUBSTITUTE(A1," ",""))+1))-1), " ", ", ")
但这不起作用,它给了我一个错误。你知道我怎么做吗

另外,如果第一个字符是“-”(不带引号),我想忽略第一个单词,只从第二个单词开始。换句话说,我想要这样的东西:

我非常爱我的生活应该回来我,爱,我的生活,非常
-我非常爱我的生活应该还我,爱,我的,我的生活,非常(忽略“-”这个词)
我爱我的应该回来我爱我的


提前感谢您的帮助

这里有一个稍微不同的方法。除了“少于5个”问题外,它还涉及“结尾没有空格的5个单词”问题:

编辑1:我刚刚注意到关于前导“-”的部分。我的添加不是很优雅,但它处理了它,并且
修剪了
任何尾随空格:

=TRIM(LEFT(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1),FIND("^",SUBSTITUTE(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1) & "^"," ","^",5))-1))
编辑2:哦,是的,逗号:

=SUBSTITUTE(TRIM(LEFT(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1),FIND("^",SUBSTITUTE(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1) & "^"," ","^",5))-1))," ",",") 

这里有一个稍微不同的方法。除了“少于5个”问题外,它还涉及“5个单词,结尾没有空格”问题:

编辑1:我刚刚注意到关于前导“-”的部分。我的添加不是很优雅,但它处理了它,并且
修剪了
任何尾随空格:

=TRIM(LEFT(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1),FIND("^",SUBSTITUTE(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1) & "^"," ","^",5))-1))
编辑2:哦,是的,逗号:

=SUBSTITUTE(TRIM(LEFT(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1),FIND("^",SUBSTITUTE(IF(LEFT(A1,2)="- ",MID(A1,3,999),A1) & "^"," ","^",5))-1))," ",",") 
试试这个:

=SUBSTITUTE(LEFT(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)),FIND("|",SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)))-1),",,",",")
该公式通过以下步骤工作:

  • 删除任何前导仪表板空间
  • 修剪任何前导或尾随空格
  • 在空格处插入逗号空格,并在后面添加逗号空格
  • 计算5和字符串中的字数中的较小者
  • 如果字符串少于五个单词,请将“|”替换为第五个逗号空格或尾随逗号空格
  • 确定“|”的位置
  • 去掉“|”及其右侧的所有字符
  • 删除由于初始字符串中嵌入任何单个逗号而导致的任何双逗号

如果您愿意考虑VBA解决方案,这个复杂的表达式可以被用户定义的函数代替:

Function words5(InputString As String) As String
    Dim wordArray As Variant
    wordArray = Split(Trim(Replace(InputString, _        'remove "-", put words into array
        "-", "", , 1)), " ")
    ReDim Preserve wordArray(LBound(wordArray) To _      'drop all but the first 5 words
        WorksheetFunction.Min(UBound(wordArray), 5 - 1))
    words5 = Replace(Join(wordArray, ", "), ",,", ",")   'rejoin the words with ", "
End Function                                             'separator
与工作表公式相比,使用此代码的另一个好处是它的可维护性,如果不访问合并到单个表达式中的原始构建块,则无法理解或安全地修改工作表公式

代码必须安装在使用它的工作簿中,或者安装在标准Personal.xlsb工作簿或加载项工作簿中

要使用该功能,请将其复制并粘贴到标准模块中,该模块可以通过VBA编辑器插入工作簿。您可以使用功能区“开发人员”选项卡上的
Visual Basic
按钮打开编辑器。

尝试以下操作:

=SUBSTITUTE(LEFT(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)),FIND("|",SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)))-1),",,",",")
该公式通过以下步骤工作:

  • 删除任何前导仪表板空间
  • 修剪任何前导或尾随空格
  • 在空格处插入逗号空格,并在后面添加逗号空格
  • 计算5和字符串中的字数中的较小者
  • 如果字符串少于五个单词,请将“|”替换为第五个逗号空格或尾随逗号空格
  • 确定“|”的位置
  • 去掉“|”及其右侧的所有字符
  • 删除由于初始字符串中嵌入任何单个逗号而导致的任何双逗号

如果您愿意考虑VBA解决方案,这个复杂的表达式可以被用户定义的函数代替:

Function words5(InputString As String) As String
    Dim wordArray As Variant
    wordArray = Split(Trim(Replace(InputString, _        'remove "-", put words into array
        "-", "", , 1)), " ")
    ReDim Preserve wordArray(LBound(wordArray) To _      'drop all but the first 5 words
        WorksheetFunction.Min(UBound(wordArray), 5 - 1))
    words5 = Replace(Join(wordArray, ", "), ",,", ",")   'rejoin the words with ", "
End Function                                             'separator
与工作表公式相比,使用此代码的另一个好处是它的可维护性,如果不访问合并到单个表达式中的原始构建块,则无法理解或安全地修改工作表公式

代码必须安装在使用它的工作簿中,或者安装在标准Personal.xlsb工作簿或加载项工作簿中


要使用该功能,请将其复制并粘贴到一个标准模块中,该模块可以通过VBA编辑器插入工作簿。您可以使用功能区“开发者”选项卡上的
Visual Basic
按钮打开编辑器。

即使破折号后没有空格,或者如果有额外空格,也可以使用该功能在文本中。我经常发现输入不是很干净

编辑:在评论了István的作品后,我的作品也完美无缺

=SUBSTITUTE(LEFT(SUBSTITUTE(TRIM(SUBSTITUTE(LEFT(TRIM(A1),1),"-","  ",1)
&MID(TRIM(A1),2,999))," ","*",5),IFERROR(FIND("*",SUBSTITUTE(
TRIM(SUBSTITUTE(LEFT(TRIM(A1),1),"-","",1)&MID(TRIM(A1),2,999))," ","*",5))-1,999))," ",",")


但我认为他的更优雅。

即使破折号后没有空格,或者文本中有多余的空格,这也行得通。我经常发现输入不太干净

编辑:在评论了István的作品后,我的作品也完美无缺

=SUBSTITUTE(LEFT(SUBSTITUTE(TRIM(SUBSTITUTE(LEFT(TRIM(A1),1),"-","  ",1)
&MID(TRIM(A1),2,999))," ","*",5),IFERROR(FIND("*",SUBSTITUTE(
TRIM(SUBSTITUTE(LEFT(TRIM(A1),1),"-","",1)&MID(TRIM(A1),2,999))," ","*",5))-1,999))," ",",")

但我觉得他的更优雅。

试试这个:

=SUBSTITUTE(LEFT(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)),FIND("|",SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)))-1),",,",",")
=修剪(左侧(替换(修剪(替换(A1,“-”,”),“,”,”,“,”,”,报告(“,”,99),5),99))

尝试以下方法:

=SUBSTITUTE(LEFT(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)),FIND("|",SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "),", ","|",MIN(LEN(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", "))-LEN(SUBSTITUTE(SUBSTITUTE(TRIM(SUBSTITUTE(A1,"- ","",1))&" "," ",", ")," ","")),5)))-1),",,",",")

=TRIM(左)(替换)(替换)(TRIM(替换(A1,“-”,“),”,“,”,”,REPT(“,99),5),99))

我想我也会把帽子扔到拳击场上。我认为这个公式应该包括以下基础:

=SUBSTITUTE(TRIM(LEFT(SUBSTITUTE(TRIM(SUBSTITUTE(A1&" ","- ",""))," ",REPT(" ",99)),99*5))," ",",")

我想我也会把我的帽子扔进拳击场。我认为这个公式应该包括以下几点:

=SUBSTITUTE(TRIM(LEFT(SUBSTITUTE(TRIM(SUBSTITUTE(A1&" ","- ",""))," ",REPT(" ",99)),99*5))," ",",")

您的数据是否总是有一个带“-”和“--”的空格,并且在“-”和“--”之前从来没有空格,并且数据中的任何地方都会有一个破折号?您的数据是否总是有一个带“-”和“--”的空格,并且在“--”之前从来没有空格,那么在您想要保留的数据中是否会有破折号?这会留下一个逗号