Excel:连接单元格并删除重复项

Excel:连接单元格并删除重复项,excel,duplicates,string-concatenation,Excel,Duplicates,String Concatenation,如何连接单元格B1:K1中的值以接收A1中的字符串。空单元格应省略。这是否可以使用Excel命令或仅使用vba实现 如果您有Office 365 Excel,则可以使用TEXTJOIN的数组形式: =TEXTJOIN(", ",TRUE,INDEX(1:1,,N(IF({1},MODE.MULT(IF((IFERROR(MATCH(B1:K1,B1:K1,0)=COLUMN(B1:K1)-MIN(COLUMN(B1:K1))+1,0))*(B1:K1<>""),COLUMN(B1:K

如何连接单元格
B1:K1中的值以接收
A1中的字符串。空单元格应省略。这是否可以使用Excel命令或仅使用vba实现


如果您有Office 365 Excel,则可以使用TEXTJOIN的数组形式:

=TEXTJOIN(", ",TRUE,INDEX(1:1,,N(IF({1},MODE.MULT(IF((IFERROR(MATCH(B1:K1,B1:K1,0)=COLUMN(B1:K1)-MIN(COLUMN(B1:K1))+1,0))*(B1:K1<>""),COLUMN(B1:K1)*{1;1}))))))
=TEXTJOIN(,),TRUE,INDEX(1:1,N)(IF({1},MODE.MULT)(IF((IFERROR(MATCH(B1:K1,B1:K1,0)=列(B1:K1)-MIN(列(B1:K1))+1,0))*(B1:K1“”),列(B1:K1)*{
作为一个数组,在退出编辑模式时,需要使用Ctrl-Shift-Enter键而不是Enter键进行确认


如果您没有office 365 Excel,则需要vba。此UDF将模拟TEXTJOIN。将其放入工作簿附带的模块中,并使用上述公式

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0

    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function
函数TEXTJOIN(delim作为字符串,skipblank作为布尔值,arr)
长得一样暗
尺寸c与长度相同
Dim arr2()
调暗t的长度,y的长度
t=-1
y=-1
如果TypeName(arr)=“范围”,则
arr2=arr.值
其他的
arr2=arr
如果结束
出错时继续下一步
t=UBound(arr2,2)
y=UBound(arr2,1)
错误转到0
如果t>=0且y>=0,则
对于c=LBound(arr2,1)到UBound(arr2,1)
对于d=LBound(arr2,1)到UBound(arr2,2)
如果arr2(c,d)“”或不是skipblank,则
TEXTJOIN=TEXTJOIN&arr2(c,d)&delim
如果结束
下一个d
下一个c
其他的
对于c=LBound(arr2)到UBound(arr2)
如果arr2(c)“”或不是skipblank,则
TEXTJOIN=TEXTJOIN&arr2(c)&delim
如果结束
下一个c
如果结束
TEXTJOIN=Left(TEXTJOIN,Len(TEXTJOIN)-Len(delim))
端函数

如果您有Office 365 Excel,则可以使用TEXTJOIN的数组形式:

=TEXTJOIN(", ",TRUE,INDEX(1:1,,N(IF({1},MODE.MULT(IF((IFERROR(MATCH(B1:K1,B1:K1,0)=COLUMN(B1:K1)-MIN(COLUMN(B1:K1))+1,0))*(B1:K1<>""),COLUMN(B1:K1)*{1;1}))))))
=TEXTJOIN(,),TRUE,INDEX(1:1,N)(IF({1},MODE.MULT)(IF((IFERROR(MATCH(B1:K1,B1:K1,0)=列(B1:K1)-MIN(列(B1:K1))+1,0))*(B1:K1“”),列(B1:K1)*{
作为一个数组,在退出编辑模式时,需要使用Ctrl-Shift-Enter键而不是Enter键进行确认


如果您没有office 365 Excel,则需要vba。此UDF将模拟TEXTJOIN。将其放入工作簿附带的模块中,并使用上述公式

Function TEXTJOIN(delim As String, skipblank As Boolean, arr)
    Dim d As Long
    Dim c As Long
    Dim arr2()
    Dim t As Long, y As Long
    t = -1
    y = -1
    If TypeName(arr) = "Range" Then
        arr2 = arr.Value
    Else
        arr2 = arr
    End If
    On Error Resume Next
    t = UBound(arr2, 2)
    y = UBound(arr2, 1)
    On Error GoTo 0

    If t >= 0 And y >= 0 Then
        For c = LBound(arr2, 1) To UBound(arr2, 1)
            For d = LBound(arr2, 1) To UBound(arr2, 2)
                If arr2(c, d) <> "" Or Not skipblank Then
                    TEXTJOIN = TEXTJOIN & arr2(c, d) & delim
                End If
            Next d
        Next c
    Else
        For c = LBound(arr2) To UBound(arr2)
            If arr2(c) <> "" Or Not skipblank Then
                TEXTJOIN = TEXTJOIN & arr2(c) & delim
            End If
        Next c
    End If
    TEXTJOIN = Left(TEXTJOIN, Len(TEXTJOIN) - Len(delim))
End Function
函数TEXTJOIN(delim作为字符串,skipblank作为布尔值,arr)
长得一样暗
尺寸c与长度相同
Dim arr2()
调暗t的长度,y的长度
t=-1
y=-1
如果TypeName(arr)=“范围”,则
arr2=arr.值
其他的
arr2=arr
如果结束
出错时继续下一步
t=UBound(arr2,2)
y=UBound(arr2,1)
错误转到0
如果t>=0且y>=0,则
对于c=LBound(arr2,1)到UBound(arr2,1)
对于d=LBound(arr2,1)到UBound(arr2,2)
如果arr2(c,d)“”或不是skipblank,则
TEXTJOIN=TEXTJOIN&arr2(c,d)&delim
如果结束
下一个d
下一个c
其他的
对于c=LBound(arr2)到UBound(arr2)
如果arr2(c)“”或不是skipblank,则
TEXTJOIN=TEXTJOIN&arr2(c)&delim
如果结束
下一个c
如果结束
TEXTJOIN=Left(TEXTJOIN,Len(TEXTJOIN)-Len(delim))
端函数

也许有一个更优雅的解决方案,但你可以使用CONCATENATE,或者一个符号:=B1&C1&D1&E1&F1&G1&H1&I1&J1&K1你在使用什么Excel?如果使用>=Excel 2016,那么你可以尝试使用
TEXTJOIN
@苦艾酒:我已经使用了CONCATENATE。但是,这并不能删除重复项,这样就可以得到像a、b、a、c、b这样的字符串。。。。这并不是我想要达到的目的。@Scott:使用MS Office 2010,教授。也许有一个更优雅的解决方案,但你可以使用CONCATENATE,或者一个符号:=B1&C1&D1&E1&F1&G1&H1&I1&J1&K1你在使用什么Excel?如果使用>=Excel 2016,那么你可以尝试使用
TEXTJOIN
@苦艾酒:我已经使用了CONCATENATE。但是,这并不能删除重复项,这样就可以得到像a、b、a、c、b这样的字符串。。。。这不是我想要实现的。@Scott:使用微软Office 2010,教授。