将范围转换为逗号分隔的字符串

时间:2014-03-12 11:22:12

标签: vba excel-vba excel

如果我有这样的专栏:

Col1
abc
def
ghi
jkl

如何将其转换为这样的字符串?:

"abc,def,ghi,jkl"

5 个答案:

答案 0 :(得分:16)

您可以使用Join()函数将1维数组的所有元素与分隔符连接起来。

下面使用Transpose()函数来形成维数组(此方法适用于单个列或行)。

Sub Main()
    Dim arr
    arr = Join(Application.Transpose(Range("A2:A5").Value), ",")
    MsgBox arr
End Sub

或作为UDF

Public Function Merge(r As Range) As String
    Merge = Join(Application.Transpose(r.Value), ",")
End Function

答案 1 :(得分:2)

如果您需要重型机械,请使用以下答案中提供的解决方案之一。对于包含数百万个细胞的射程,我也遇到了类似的挑战。在这种情况下,JOIN将导致崩溃。

在此处检查问题: Turn Excel range into VBA string

我已经测试了以上链接中提供的所有方法。基于功能JOIN的解决方案性能低下,甚至会导致崩溃。

普通遍历所有单元格比JOIN函数要快得多。接受的答案中的 sting构建器甚至更快。使用字符串生成器,数百万个单元格组成的字符串可以在几秒钟内构建。这是我最终得到的解决方案。

答案 2 :(得分:0)

双转置适用于对单行值进行字符串连接。谢谢@ user2140173和@brettdj!

debug.print join(Application.Transpose(Application.Transpose(Range("A1:G1").Value)),",")

答案 3 :(得分:0)

Public Function COLSASLIST(Rng As Range) As String
    Dim tempStr1 As String
    tempStr1 = Replace(Replace(Join(Application.Transpose(Application.Transpose(Rng.Value)), ","), ",,", ""), ",,", ",")
    If Right(tempStr1, 1) = "," Then tempStr1 = Left(tempStr1, Len(tempStr1) - 1)
    COLSASLIST = tempStr1
End Function

Public Function ROWSASLIST(Rng As Range) As String
    Dim tempStr1 As String
    tempStr1 = Replace(Replace(Join(Application.Transpose(Rng.Value), ","), ",,", ","), ",,", ",")
    If Right(tempStr1, 1) = "," Then tempStr1 = Left(tempStr1, Len(tempStr1) - 1)
    ROWSASLIST = tempStr1
End Function

答案 4 :(得分:0)

使用 Microsoft 365 / Excel2019(+/- Mac)和Excel for Web的新的动态工作表功能TextJoin() ,您可以使用以下范围参数构建udf

  • (1)列
  • (2)连续甚至
  • (3)连续范围输入(例如“ A2:C5”)

可选的第二个参数ExcludeBlanks允许省略空白值。

函数结果是一个逗号分隔的列表(对于情况(3)来说很重要:读取顺序为<行>逐行显示)。

Function Rng2List(rng As Range, Optional ExcludeBlanks As Boolean = True) As String
    Rng2List = WorksheetFunction.TextJoin(",", ExcludeBlanks, rng)
End Function

Textjoin function上查看帮助