Вернуть все элементы коллекции сразу, чтобы функционировать - PullRequest
0 голосов
/ 03 апреля 2020

Я борюсь с выходом из коллекции. Подпрограмма выполняет go в файл XML и получает несколько наборов данных (имя + порядковый номер). Только рейтинговые числа go из 1 - 25. Оно отфильтрует имя и даст только рейтинговый номер.

Функция выполняет преобразование строки чисел в более читаемый обзор, например 1, 2, 3, 5, 6, 20, 22, 23, 24 преобразуются в 1-3, 5-6, 20, 22-24. Все числа в первой строке должны быть разделены "," отсюда Coll.add ","

Теперь я знаю, как получить данные с помощью for each item in Coll, но я не могу получить все значения в 1 строка Может быть, коллекции не являются идеальными функциями для этого?

Итак, вопрос в том, как я могу получить полный набор в виде строки как есть? Потому что все в правильном порядке и с add "," моя коллекция завершена.

    Dim Coll As Collection
    Set Coll = New Collection

    Set NameNod = oXMLFile.SelectNodes("/Report/Results/Name/elt/NameId/text()")

For i = 0 To NameNod.Length - 1

    Ranking = Right(NameNod(i).NodeValue, 2) 'returns only the ranking number

    Coll.Add Ranking
    Coll.Add "," 

Next
Function IntoRanges(aString As String, Optional Delimiter As String = ",") As String
    Dim NextBit As String
    Dim i As Long
    Dim Items As Variant
    Items = Split(aString, Delimiter)

    IntoRanges = Items(0)
    For i = 0 To UBound(Items) - 1
        If Val(Items(i)) + 1 = Val(Items(i + 1)) Then
            NextBit = "-" & Val(Items(i + 1))
        Else
            If NextBit = vbNullString Then
                IntoRanges = IntoRanges & Delimiter & Val(Items(i + 1))

            Else
                IntoRanges = IntoRanges & NextBit & Delimiter & Val(Items(i + 1))
                NextBit = vbNullString
            End If
        End If
    Next i
    IntoRanges = IntoRanges & NextBit
End Function

Ответы [ 3 ]

2 голосов
/ 03 апреля 2020

Вместо использования коллекции вы можете сразу создать строку

    Dim Coll As Collection
    Set Coll = New Collection

    Set NameNod = oXMLFile.SelectNodes("/Report/Results/Name/elt/NameId/text()")

    Dim aString As String
    For i = 0 To NameNod.Length - 1

        ranking = Right(NameNod(i).NodeValue, 2) 'returns only the ranking number

'        Coll.Add ranking
'        Coll.Add ","
        aString = aString & ranking & ","
    Next
    ' remove the last comma
    aString = Left(aString, Len(aString) - 1)

PS Если вы хотите остаться в коллекции, я бы предложил удалить coll.add "," и использовать следующее function

Function intoString(col As Collection, Optional Delimiter As String = ",") As String
    Dim i As Long
    Dim res As String
    For i = 1 To col.Count
        res = res & col.Item(i) & Delimiter
    Next i
    res = Left(res, Len(res) - 1)
    intoString = res
End Function

И ваш код будет выглядеть так

        Dim Coll As Collection
        Set Coll = New Collection

        Set NameNod = oXMLFile.SelectNodes("/Report/Results/Name/elt/NameId/text()")

    For i = 0 To NameNod.Length - 1

        Ranking = Right(NameNod(i).NodeValue, 2) 'returns only the ranking number

        Coll.Add Ranking
        'Coll.Add "," 

    Next

   Debug.Print IntoRanges(intoString(Coll))
0 голосов
/ 03 апреля 2020

Если вы хотите использовать разделитель (например, da sh) для диапазонов и пропустить промежуточные значения, вы можете использовать эту функцию:

Function IntoString(ByVal coll As Collection, Optional nxtDelimiter As String = ",", Optional rngDelimiter As String = "-") As String
Dim i As Long
Dim IStr As String
IStr = coll.Item(1)
For i = 2 To coll.Count - 1
    If coll.Item(i) <> coll.Item(i - 1) + 1 Then
        IStr = IStr & nxtDelimiter & coll.Item(i)
    Else
        If coll.Item(i) <> coll.Item(i + 1) - 1 Then IStr = IStr & rngDelimiter & coll.Item(i)
    End If
Next i
If coll.Item(coll.Count) = coll.Item(coll.Count - 1) + 1 Then
    IStr = IStr & rngDelimiter & coll.Item(coll.Count)
Else
    IStr = IStr & nxtDelimiter & coll.Item(coll.Count)
End If
IntoString = IStr
End Function

Но имейте в виду, что ваша коллекция должна содержать только значения (не разделители).

0 голосов
/ 03 апреля 2020

вы можете использовать Dictonary объект, который позволяет вам получить как окончательную строку, так и массив

 Dim NameNod As Object
    Set NameNod = oXMLFile.SelectNodes("/Report/Results/Name/elt/NameId/text()")

    Dim myString As String
    Dim myArr As Variant
    Dim i As Long
    With CreateObject("Scripting.Dictionary")
        For i = 0 To NameNod.Length - 1
            Ranking = Right(NameNod(i).NodeValue, 2) 'returns only the ranking number
            .Add Ranking, 0
        Next
        myString = Join(.keys, ",")
        myArr = .keys
    End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...