Excel 2010 VBA-用逗号分割字符串,跳过空白结果

arrays excel vba excel-vba delimited

942 观看

2回复

20 作者的声誉

我正在使用以下代码将一列用逗号分隔的列表切成一行,并在新行中返回每个条目:

Sub SliceNDice()
    '
    ' Splits the locations cells according to commas and pushes to new rows
    ' Code courtesy of brettdj (http://stackoverflow.com/questions/8560718/split-comma-separated-entries-to-new-rows)
    '
    Dim objRegex As Object
    Dim x
    Dim Y
    Dim lngRow As Long
    Dim lngCnt As Long
    Dim tempArr() As String
    Dim strArr
    Set objRegex = CreateObject("vbscript.regexp")

    objRegex.Pattern = "^\s+(.+?)$"
     'Define the range to be analysed
    x = Range([a1], Cells(Rows.Count, "c").End(xlUp)).Value2
    ReDim Y(1 To 3, 1 To 1000)
    For lngRow = 1 To UBound(x, 1)
         'Split each string by ","
        tempArr = Split(x(lngRow, 3), ",")
        For Each strArr In tempArr
            lngCnt = lngCnt + 1
             'Add another 1000 records to resorted array every 1000 records
            If lngCnt Mod 1000 = 0 Then ReDim Preserve Y(1 To 3, 1 To lngCnt + 1000)
            Y(1, lngCnt) = x(lngRow, 1)
            Y(2, lngCnt) = x(lngRow, 2)
            Y(3, lngCnt) = objRegex.Replace(strArr, "$1")
        Next
    Next lngRow
     'Dump the re-ordered range to columns E:G
    [e1].Resize(lngCnt, 3).Value2 = Application.Transpose(Y)

End Sub

尽管此代码可以完美运行,但它具有致命的缺陷,因为C列单元格中的任何双逗号都将导致空白单元格被推送到G列中的新行。

有谁知道如何编辑代码,以便它不会在G列中创建带有空单元格的新行,而是跳过它们并在其位置输入下一行,就好像多余的逗号根本就不在C列中一样?

作者: Anders Kilmark 的来源 发布者: 2016 年 2 月 16 日

回应 (2)


1

4897 作者的声誉

您可以循环使用双逗号来清理输入,而不是固定输出,这是一个工作示例:

A1中的文字: Hello,,World,This,,Is,,,,,,,A,,Test

Sub TestString()
Dim MyString As String
MyString = Range("A1").Text
Do Until Len(MyString) = Len(Replace(MyString, ",,", ","))
    MyString = Replace(MyString, ",,", ",")
Loop
MsgBox MyString
End Sub

您将在拆分之前执行此操作

如果您希望将其用作功能(在您的情况下会更好),请执行以下操作:

Function FixDoubleComma(MyString As String)
Do Until Len(MyString) = Len(Replace(MyString, ",,", ","))
    MyString = Replace(MyString, ",,", ",")
Loop
FixDoubleComma = MyString
End Function

然后将其替换为您的代码:

tempArr = Split(x(lngRow, 3), ",")

有了这个:

tempArr = Split(FixDoubleComma(x(lngRow, 3)), ",")
作者: Dan Donoghue 发布者: 16.02.2016 02:55

2

0 作者的声誉

只需在tempArr循环中的For Each strArr中测试strArr的字符串长度即可。

For Each strArr In tempArr
    If CBool(Len(strArr)) Then
        lngCnt = lngCnt + 1
         'Add another 1000 records to resorted array every 1000 records
        If lngCnt Mod 1000 = 0 Then ReDim Preserve Y(1 To 3, 1 To lngCnt + 1000)
        Y(1, lngCnt) = x(lngRow, 1)
        Y(2, lngCnt) = x(lngRow, 2)
        Y(3, lngCnt) = objRegex.Replace(strArr, "$1")
    End If
Next strArr
作者: user4039065 发布者: 16.02.2016 03:29
32x32