EXCEL return range of values based on criteria

后端 未结 1 1765
感情败类
感情败类 2020-12-18 17:28

I have a VBA function that I would like to pass a custom range of data (As opposed to a full table column range) only when certain criteria within that table is met. For ex

相关标签:
1条回答
  • 2020-12-18 17:40

    If you have Office 365 Excel or later you can use TEXTJOIN as an Array Formula:

    ="[" & TEXTJOIN(",",TRUE,IF(($A$2:$A$7=F2)*($C$2:$C$7="approved"),$B$2:$B$7,"")) & "]"
    

    Being an Array Formula it needs to be confirmed with Ctrl-Shift-Enter instead of Enter when exiting edit mode.


    If you do not have Office 365 Excel or later, here is a UDF that will do what you want:

    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
    

    You would call it similar to SUMIFS:

    =TEXTJOINIFS(B:B,",",A:A,F2,C:C,"approved")
    

    It only works with columns not rows.

    0 讨论(0)
提交回复
热议问题