Function TextJoin_20(Delimiter As String, Ignore_Emtpy As Boolean, ParamArray args() As Variant) As Variant
Dim results As String
Dim count As Long, i As Long, j As Long, length As Long, pos As Long
Dim argument As Variant, v As Variant
Select Case TypeName(args(0))
Case "Empty"
argument = Array()
Case "Range"
If args(0).count = 1 Then
argument = Array(args(0).Value)
Else
argument = args(0).Value
End If
Case "String"
argument = Array(args(0))
Case "Variant()"
argument = args(0)
End Select
For Each v In argument
length = length + Len(v)
count = count + 1
Next
results = Space(length + count * Len(Delimiter))
If count - 1 + LBound(argument) = UBound(argument) Then
For Each v In argument
If Not Ignore_Emtpy Or Len(v) > 0 Then
Mid(results, pos + 1, Len(v) + Len(Delimiter)) = v & Delimiter
pos = pos + Len(v) + Len(Delimiter)
End If
Next
Else
For i = LBound(argument) To UBound(argument)
For j = LBound(argument, 2) To UBound(argument, 2)
If Not Ignore_Emtpy Or Len(argument(i, j)) > 0 Then
Mid(results, pos + 1, Len(argument(i, j)) + Len(Delimiter)) = argument(i, j) & Delimiter
pos = pos + Len(argument(i, j)) + Len(Delimiter)
End If
Next
Next
End If
'Trim results needed to adjust for skipping empty values
results = Left(results, pos)
For i = 1 To UBound(args)
results = results & TextJoin_20(Delimiter, Ignore_Emtpy, args(i)) & Delimiter
Next
Debug.Print Left(results, Len(results) - Len(Delimiter))
TextJoin_20 = Left(results, Len(results) - Len(Delimiter))
End Function