Пропустить двойную запятую в функции разделения - PullRequest
0 голосов
/ 21 апреля 2019

My String (strSQL) Значение равно 1,2,3, 4, и мой результат показывает пустое значение от 3 до 4 из-за двойной запятой (,,).Мой код следующий: -

strParts = Split(strSQL, ", ")
        For intCounter = LBound(strParts()) To UBound(strParts())
            Me.Controls("cmd" & intCounter).Visible = True
            Me.Controls("cmd" & intCounter).Caption = strParts(intCounter)                
        Next intCounter

Ответы [ 3 ]

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

Как вы могли бы также утроить запятые, просто игнорируйте пустые записи:

Dim Part As String

strParts = Split(strSQL, ",")

For intCounter = LBound(strParts()) To UBound(strParts())
    Part = Trim(strParts(intCounter))
    If Part <> "" Then
        Me.Controls("cmd" & Part).Visible = True
        Me.Controls("cmd" & Part).Caption = Part
    Else
        Me.Controls("cmd" & Part).Visible = False
    End If
Next
1 голос
/ 22 апреля 2019

Я думаю, что лучший способ сделать это - «очистить» строку, чтобы удалить лишние запятые перед разбиением. Однако, как отмечает @Gustaf, у вас может быть более двух запятых подряд. Поэтому возможное решение состоит в том, чтобы итеративно удалять лишние запятые, пока у вас их нет. Такая функция выглядит так:

' given a string that contains consecutive commas (e.g. abc,,def,,,ghi),
' removes all but the first commas (e.g. abc,def,ghi
Public Function RemoveDuplicateCommas(ByVal s As String) As String
    Do While InStr(1, s, ",,", vbBinaryCompare) > 0
        s = Replace(s, ",,", ",")
    Loop

    RemoveDuplicateCommas = s
End Function

Чтобы использовать эту функцию, сделайте что-то вроде этого:

strSQL = "1,2,3,,4,,,5"
strSQL = RemoveDuplicateCommas(strSQL)
?strSQL
1,2,3,4,5
?join(split(strsql, ","), ",")
1,2,3,4,5
1 голос
/ 21 апреля 2019

Вы можете заменить двойной (,,) на один (,) перед разделением:

strSQL = Replace(strSQL, ",,", ",")

Или вы используете отдельный индекс:

strParts = Split(strSQL, ",")

Dim index As Long
Dim counter As Long
For index = LBound(strParts()) To UBound(strParts())
    If Len(Trim(strParts(index))) > 1 Then
        counter = counter + 1
        Me.Controls("cmd" & counter).Visible = True
        Me.Controls("cmd" & counter).Caption = strParts(index)
    End If
Next index
...