Объединить строки и удалить лишнюю запятую - PullRequest
3 голосов
/ 08 апреля 2019

Я пытаюсь объединить несколько строк и разделить их запятыми, а затем впоследствии удалить лишние, ведущие и конечные запятые.

Например, при вводе TEST("", "b", "c", "", "") я бы хотел получить b, c

Однако, мое регулярное выражение ,$| ,+|^, на самом деле не учитывает повторные запятые:

Function TEST(a, b, c, d, e)
    res = a & ", " & b & ", " & c & ", " & d & ", " & e

    Debug.Print (res)
    Dim regex As Object, str, result As String
    Set regex = CreateObject("VBScript.RegExp")

    With regex
      .Pattern = ",$| ,+|^,"
    End With

    Dim ReplacePattern As String
    ReplacePattern = ""

    res = regex.Replace(res, ReplacePattern)

    TEST = res
End Function

Как я могу это сделать?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2019

Самым элегантным является предложение @ ScottCraner о TEXTJOIN (удалит эту часть ответа, если он хочет опубликовать ее как свою собственную)

Private Function nonEmptyFields(ParamArray strings() As Variant) As String
    nonEmptyFields = WorksheetFunction.TextJoin(",", True, Array(strings))
End Function

enter image description here

Примечание: Это будет работать только для Office 365+, но вы всегда можете создать свою собственную версию TEXTJOIN


Другим вариантом было бы перебрать ParamArray строк и добавить их вместе, в зависимости от их содержимого (заполнены они или пусты)

Private Function nonEmptyFields(ParamArray strings() As Variant) As String

    Dim result As String
    Dim i As Byte

    For i = LBound(strings) To UBound(strings)
        If Len(strings(i)) <> 0 Then
            If result = vbNullString Then
                result = strings(i)
            Else
                result = result & "," & strings(i)
            End If
        End If
    Next i

    nonEmptyFields = result

End Function

И то и другое даст желаемый результат с настройкой

    Debug.Print nonEmptyFields(a, b, c, d, e, f) ' "", "b", "c", "", "", ""

enter image description here

1 голос
/ 08 апреля 2019

Мой безобразный раствор, поддерживающий те же параметры:

Function TEST(a, b, c, d, e)

    If a <> "" Then res = a

    If b <> "" Then
        If res <> "" Then
            res = res & ", " & b
        Else
            res = b
        End If
    End If

    If c <> "" Then
        If res <> "" Then
            res = res & ", " & c
        Else
            res = c
        End If
    End If

    If d <> "" Then
        If res <> "" Then
            res = res & ", " & d
        Else
            res = d
        End If
    End If

    If e <> "" Then
        If res <> "" Then
            res = res & ", " & e
        Else
            res = e
        End If
    End If

    TEST = res

End Function

img1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...