如何在Excel中将最后一项之前的单词连接成一个带有“和”的句子?

我想要在Excel中join单词列表( 不是在VBA中,在工作表中有一个Excel公式 ),以下列规范:

公式应该忽略空单元格。

如果单元格数组中有多个项目,则公式应该在最终项目之前将单词与“和”连接起来。

如果有两个以上的项目,公式应该在项目之间加上“,”。

示例:A1 =狗A2 =猫A3 =鸟A4 =鱼结果将是:狗,猫,鸟和鱼

A1=dog A2=cat A3=(empty cell) A4=fish Result would be: dog, cat, and fish A1=dog A2=(empty cell) A3=bird A4=(empty cell) Result would be: dog and bird A1=dog A2=(empty cell) A3=(empty cell) A4=(empty cell) Result would be: dog 

请好吗? 我保证我已经search和search答案。

编辑:谢谢,ExcelArchitect,我明白了! 这是我第一次使用自定义函数。 您可以像使用工作表中的其他function一样使用它! 这太棒了

不要推我的运气,但如何得到两个单元格与我的结果连接,如果只有一个单词的结果和两个其他单元格,如果有多个单词? 例如:如果你为我做的function只返回“狗”,我想它连接一个单元格与文本(B1)“我最喜欢穿的是一个”,然后“狗”,然后另一个单元格(B2 )说“服装”。 把这句话写成“我最喜欢穿的衣服是狗服”。 但是,如果它返回多于一个动物,它将连接两个其他的细胞,如:细胞C1“我最喜欢穿的衣服是”,“狗,猫,鸟”和Cell C2“服装”。 所以它会说“我最喜欢穿的衣服是狗,猫,和鸟儿的服装”。

如果你好奇,我的数据与动物或服装无关。 我正在编写一个程序,将进行心理testing,然后从testing成绩(我是心理学家)创build一个解释性报告。

玛丽安妮

玛丽安妮:

这将是使用VBA的好时机! 但是,如果你不想要,没有它,有一种方法可以实现你的目标。

你必须在这里解释所有可能的结果。 有4种不同的动物,这意味着你有15个结果:

在这里输入图像说明

你的方程只需要考虑所有的15.这是很长的,并作为结果画出来。 因此,如果你有超过4个动物,你想变成短语,你应该去的VBA路线。

这是我的设置:

在这里输入图像说明

A7中的公式如下:

 =IF(AND(A2<>"", A3="", A4="", A5=""), A2, IF(AND(A2="", A3<>"", A4="", A5=""), A3, IF(AND(A2="", A3="", A4<>"", A5=""), A4, IF(AND(A2="", A3="", A4="", A5<>""), A5, IF(AND(A2<>"", A3<>"", A4="", A5=""), A2&" and "&A3, IF(AND(A2<>"", A3="", A4<>"", A5=""), A2&" and "&A4, IF(AND(A2<>"", A3="", A4="", A5<>""), A2&" and "&A5, IF(AND(A2="", A3<>"", A4<>"", A5=""),A3&" and "&A4, IF(AND(A2="", A3<>"", A4="", A5<>""), A3&" and "&A5, IF(AND(A2="", A3="", A4<>"", A5<>""),A4&" and "&A5, IF(AND(A2<>"", A3<>"", A4<>"", A5=""), A2&", "&A3&", and "&A4, IF(AND(A2<>"", A3<>"", A4="", A5<>""), A2&", "&A3&", and "&A5, IF(AND(A2<>"", A3="", A4<>"", A5<>""), A2&", "&A4&", and "&A5, IF(AND(A2="", A3<>"", A4<>"", A5<>""), A3&", "&A4&", and "&A5, A2&", "&A3&", "&A4&", and "&A5)))))))))))))) 

这里是通过Excel:

在这里输入图像说明

玛丽安妮 – 我是一个如此的书呆子,我必须这样做。 这里是VBA解决scheme,你可以有任意多的名字! 将这段代码粘贴到工作簿中的一个新模块中(去开发人员 – > Visual Basic,然后插入 – >新模块,并粘贴),然后你可以像工作表一样使用它。 只要给它名称的范围,你应该很好去! -Matt

 Function CreatePhrase(NamesRng As Range) As String 'Creates a comma-separated phrase given a list of words or names Dim Cell As Range Dim l As Long Dim cp As String 'Add commas between the values in the cells For Each Cell In NamesRng If Not IsEmpty(Cell) And Not Cell.Value = "" And Not Cell.Value = " " Then cp = cp & Cell.Value & ", " End If Next Cell 'Remove trailing comma and space If Right(cp, 2) = ", " Then cp = Left(cp, Len(cp) - 2) 'If there is only one value (no commas) then quit here If InStr(1, cp, ",", vbTextCompare) = 0 Then CreatePhrase = cp Exit Function End If 'Add "and" to the end of the phrase For l = 1 To Len(cp) If Mid(cp, Len(cp) - l + 1, 1) = "," Then cp = Left(cp, Len(cp) - l + 2) & "and" & Right(cp, l - 1) Exit For End If Next l 'If there are only two words or names (only one comma) then remove the comma If InStr(InStr(1, cp, ",", vbTextCompare) + 1, cp, ",", vbTextCompare) = 0 Then cp = Left(cp, InStr(1, cp, ",", vbTextCompare) - 1) & Right(cp, Len(cp) - InStr(1, cp, ",", vbTextCompare)) End If CreatePhrase = cp End Function 

希望有所帮助! 马特,通过ExcelArchitect.com

VBA更简单。 一个公式是相当复杂的,因为Excel没有原生函数允许连接一个范围。 但是,由于你已经写了八只动物,所以可以按照你的规则连接A1:A8的内容。 您可以在公式中的明显位置更改这些位置。

我做了一个改变:我可能是错的,但是我相信英国的规则表明前面的逗号应该被省略,所以我这样做了。 如有必要,可以添加它。 编辑:进一步的调查揭示了美国和英国的规则之间的差异:美国的规则是你要求的,英国的规则省略逗号前的连词。 我会修改公式和UDF以符合美国的惯例。

在公式中,修改是在and之前放置一个comma 。 UDF的变化同样很小。

该公式由以下序列构build而成:

在这里输入图像说明

所以把这些公式放在一起,只是为了提到A1:A8,我们就把这个怪物说了出来:

 =SUBSTITUTE(IFERROR(SUBSTITUTE(MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","),2,LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","))-2),",",",and ",LEN(MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","),2,LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","))-2))-LEN(SUBSTITUTE(MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","),2,LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","))-2),",",""))),MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","),2,LEN(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(CONCATENATE(",",A1,",",A2,",",A3,",",A4,",",A5,",",A6,",",A7,",",A8,","),",,",","),",,",","),",,",","))-2)),",",", ") 

这是一个VBA解决scheme,将允许任何数量的项目; 它按照与上面相同的规则进行连接。


 Option Explicit Function ConcatRangeWithAnd(RG As Range, Optional Delim As String = ", ") Dim COL As Collection Dim C As Range Dim S As String Dim I As Long Set COL = New Collection For Each C In RG If Len(C.Text) > 0 Then COL.Add C.Text Next C Select Case COL.Count Case 0 Exit Function Case 1 ConcatRangeWithAnd = COL(1) Case 2 ConcatRangeWithAnd = COL(1) & " and " & COL(2) Case Else For I = 1 To COL.Count - 1 S = S & COL(I) & ", " Next I ConcatRangeWithAnd = S & "and " & COL(COL.Count) End Select End Function