如何在允许数组输入的 VBA UDF 中复制 Excel 的 TEXTJOIN 函数 [英] How to replicate Excel's TEXTJOIN function in VBA UDF that allows array inputs

查看:43
本文介绍了如何在允许数组输入的 VBA UDF 中复制 Excel 的 TEXTJOIN 函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我在不同的单元格中有不同的值,我如何将它们与带有我自己选择的分隔符(如,"或|"等)的函数连接在一起.

If I have different values in different cells, how can I join them together with a function with a delimiter of my own choosing (like "," or "| ", etc.).

例如:

如果你有:

A1: foo
A2: bar
A3: baz

您可以输入 A4:

=somefunction("",A1:A3)

你会进入A4:

foo bar baz

此外,如果输入是数组函数的结果,例如:{foo, bar, bar}

Moreover, what if the inputs are results of an array function, like: {foo, bar, bar}

也许 UDF 会起作用?

Maybe a UDF would work?

我知道在 Microsoft Office 2016 中有 textjoin 功能,但它仅适用于 Office 365 订阅者.而且这个函数不能处理数组输入.

I know in Microsoft Office 2016 there is the textjoin function, but it is only available for Office 365 subscribers. And this function cannot handle array inputs.

推荐答案

试试这个用户定义的函数.它用途广泛.它将需要输入硬编码字符串、单个单元格、单元格范围、数组或它们的任何组合.空白将被忽略.查看输出照片.

Try this user defined function. It is quite versatile. It will take for input hard-coded strings, single cell, cell ranges, arrays, or any mixture of them. Blanks will be ignored. See the photo for outputs.

Public Function TJoin(Sep As String, ParamArray TxtRng() As Variant) As String
On Error Resume Next
'Sep is the separator, set to "" if you don't want any separator. Separator must be string or single cell, not cell range
'TxtRng is the content you want to join. TxtRng can be string, single cell, cell range or array returned from an array function. Empty content will be ignored
Dim OutStr As String 'the output string
Dim i, j, k, l As Integer 'counters
Dim FinArr(), element As Variant 'the final array and a temporary element when transfering between the two arrays

'Go through each item of TxtRng(),  depending on the item type, transform and put it into FinArray()
i = 0 'the counter for TxtRng
j = 0 'the counter for FinArr
k = 0: l = 0 'the counters for the case of array from Excel array formula
Do While i < UBound(TxtRng) + 1
    If TypeName(TxtRng(i)) = "String" Then 'specified string like "t"
        ReDim Preserve FinArr(0 To j)
        FinArr(j) = "blah"
        FinArr(j) = TxtRng(i)
        j = j + 1
    ElseIf TypeName(TxtRng(i)) = "Range" Then 'single cell or range of cell like A1, A1:A2
        For Each element In TxtRng(i)
            ReDim Preserve FinArr(0 To j)
            FinArr(j) = element
            j = j + 1
        Next
    ElseIf TypeName(TxtRng(i)) = "Variant()" Then 'array returned from an Excel array formula
         For k = LBound(TxtRng(0), 1) To UBound(TxtRng(0), 1)
            For l = LBound(TxtRng(0), 2) To UBound(TxtRng(0), 2)
                ReDim Preserve FinArr(0 To j)
                FinArr(j) = TxtRng(0)(k, l)
                j = j + 1
            Next
         Next
    Else
        TJoin = CVErr(xlErrValue)
        Exit Function
    End If
i = i + 1
Loop

'Put each element of the new array into the join string
For i = LBound(FinArr) To UBound(FinArr)
    If FinArr(i) <> "" Then 'Remove this line if you want to include empty strings
    OutStr = OutStr & FinArr(i) & Sep
    End If
Next
 TJoin = Left(OutStr, Len(OutStr) - Len(Sep)) 'remove the ending separator

End Function

截图:

假设您的单元格如下所示:

Let's say your cells look like this:

  A                          B
1 find                       good
2 apples                     for free
3 online                     now
4 at                         from this site:
5 https://www.example.com

您可以输入一些公式,例如:

You can put in some formulas like:

=tjoin(" ","please",$A$1,$A$3:$A$5)
=tjoin($A$6,$A$1:$A$5,"C1")
=tjoin(" ",IF(LEN($A$1:$A$5)>3,$A$1:$A$5,""))
=tjoin(" ",IF(LEN($A$1:$B$5)>3,$A$1:$B$5,""))

您的结果将是:

please find online at https://www.example.com
find -- apples -- online -- at -- https://www.example.com -- C1
find apples online at https://www.example.com
find good apples for free online from this site: https://www.example.com

这篇关于如何在允许数组输入的 VBA UDF 中复制 Excel 的 TEXTJOIN 函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆