Excel 连接和如果函数出现问题

Excel 连接和如果函数出现问题,excel,if-statement,concatenation,formula,Excel,If Statement,Concatenation,Formula,我试图获取一列包含课程信息(带文本)或仅包含数字0的数据,并将该列中不等于0的值串在另一个选项卡上的一个单元格中 例: [*A列*] 课程B8001 课程B8002 0 0 课程B8003 ^我想选这个专栏… 把它变成这个 第1单元:课程B8001、课程B8002、课程B8003(全部在同一列下,仅在一个单元中) 我一直在使用concatenate和if函数,但都没有用,我被卡住了 感谢您的帮助如果您有Office 365 Excel,则可以使用以下数组公式: =TEXTJOIN(",",TRU

我试图获取一列包含课程信息(带文本)或仅包含数字0的数据,并将该列中不等于0的值串在另一个选项卡上的一个单元格中

例:

[*A列*] 课程B8001 课程B8002 0 0 课程B8003 ^我想选这个专栏…
把它变成这个

第1单元:
课程B8001、课程B8002、课程B8003
(全部在同一列下,仅在一个单元中)

我一直在使用concatenate和if函数,但都没有用,我被卡住了


感谢您的帮助

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

=TEXTJOIN(",",TRUE,IF(A1:A100<>0,A1:A100,""))
=TEXTJOIN(“,”,TRUE,IF(A1:A1000,A1:A100,”)
作为一个数组公式,在退出编辑模式时需要使用Ctrl-Shift-Enter而不是Enter进行确认


如果您没有OFFICE 365 Excel,则需要帮助器列或vba

助手,将其放入B1并拖动数据的长度:

=IF(A1<>0,A1&","&B2,B2)
=IF(A10,A1&“,”与B2,B2)
您的连接语句将出现在B1中

vba,将其放入附加到工作簿的模块中:

Function TEXTJOINIFS(rng As Range, delim As String, ParamArray arr() As Variant)
    Dim rngarr As Variant
    rngarr = Intersect(rng, rng.Parent.UsedRange).Value

    Dim condArr() As Boolean
    ReDim condArr(1 To Intersect(rng, rng.Parent.UsedRange).Rows.Count) As Boolean


    Dim i As Long
    For i = LBound(arr) To UBound(arr) Step 2
        Dim colArr() As Variant
        colArr = Intersect(arr(i), arr(i).Parent.UsedRange).Value
        Dim j As Long
        For j = LBound(colArr, 1) To UBound(colArr, 1)

            If Not condArr(j) Then
                Dim charind As Long
                charind = Application.Max(InStr(arr(i + 1), ">"), InStr(arr(i + 1), "<"), InStr(arr(i + 1), "="))
                Dim opprnd As String
                If charind = 0 Then
                    opprnd = "="
                Else
                    opprnd = Left(arr(i + 1), charind)
                End If
                Dim t As String
                t = """" & colArr(j, 1) & """" & opprnd & """" & Mid(arr(i + 1), charind + 1) & """"
                If Not Application.Evaluate(t) Then condArr(j) = True
            End If
        Next j
    Next i

    For i = LBound(rngarr, 1) To UBound(rngarr, 1)
        If Not condArr(i) Then
            TEXTJOINIFS = TEXTJOINIFS & rngarr(i, 1) & delim
        End If
    Next i

    TEXTJOINIFS = Left(TEXTJOINIFS, Len(TEXTJOINIFS) - Len(delim))

End Function
函数TEXTJOINIFS(rng作为范围,delim作为字符串,paramary arr()作为变量)
Dim-rngarr作为变体
rngarr=Intersect(rng,rng.Parent.UsedRange).Value
Dim condArr()作为布尔值
ReDim condArr(1以布尔形式相交(rng,rng.Parent.UsedRange).Rows.Count)
我想我会坚持多久
对于i=LBound(arr)至UBound(arr)步骤2
Dim colArr()作为变量
colArr=Intersect(arr(i),arr(i).Parent.UsedRange.Value
Dim j尽可能长
对于j=LBound(colArr,1)到UBound(colArr,1)
如果不是condArr(j),则
黯淡如长

charind=Application.Max(InStr(arr(i+1),“>”),InStr(arr(i+1),“您是否有
TEXTJOIN()
?是否每个论坛都有
的结尾?@BruceWayne不,我没有那个特别的公式。@ScottCraner--没有!很抱歉,我只是把它放在那里表示分离。第一次来这里的用户,不确定这个论坛的格式。[编辑以删除,]显示你的代码,它会被查看。你只需读取行,执行解析函数,如果它们通过验证,则附加它,构建一个长字符串,只放在一个单元格中。发布一些代码。谢谢你——你能深入了解你所说的helper列是什么意思吗?我必须在使用公式之前设置它:=if(A10,A1&“,&B2,B2)?
Function TEXTJOINIFS(rng As Range, delim As String, ParamArray arr() As Variant)
    Dim rngarr As Variant
    rngarr = Intersect(rng, rng.Parent.UsedRange).Value

    Dim condArr() As Boolean
    ReDim condArr(1 To Intersect(rng, rng.Parent.UsedRange).Rows.Count) As Boolean


    Dim i As Long
    For i = LBound(arr) To UBound(arr) Step 2
        Dim colArr() As Variant
        colArr = Intersect(arr(i), arr(i).Parent.UsedRange).Value
        Dim j As Long
        For j = LBound(colArr, 1) To UBound(colArr, 1)

            If Not condArr(j) Then
                Dim charind As Long
                charind = Application.Max(InStr(arr(i + 1), ">"), InStr(arr(i + 1), "<"), InStr(arr(i + 1), "="))
                Dim opprnd As String
                If charind = 0 Then
                    opprnd = "="
                Else
                    opprnd = Left(arr(i + 1), charind)
                End If
                Dim t As String
                t = """" & colArr(j, 1) & """" & opprnd & """" & Mid(arr(i + 1), charind + 1) & """"
                If Not Application.Evaluate(t) Then condArr(j) = True
            End If
        Next j
    Next i

    For i = LBound(rngarr, 1) To UBound(rngarr, 1)
        If Not condArr(i) Then
            TEXTJOINIFS = TEXTJOINIFS & rngarr(i, 1) & delim
        End If
    Next i

    TEXTJOINIFS = Left(TEXTJOINIFS, Len(TEXTJOINIFS) - Len(delim))

End Function
=TEXTJOINIFS(A:A,",",A:A,"<>0")