Добавить вариант строки в пустой массив вариантов - PullRequest
0 голосов
/ 26 июня 2019

Я хотел бы многократно добавлять массив строковых значений в мастер-массив, который изначально пуст. Я не могу заставить его добавить.

Sub main()

    Dim num As Integer, root As String, pathToFile As String, allOf As Variant, someOf As Variant
    Dim i As Integer, opts() As String, val As Integer
    root = Application.ActiveWorkbook.Path
    pathToFile = root & "\" & "name" & ".txt"

    num = 5  ' the number of files I may have

    For i = 0 To num - 1  ' loop over all the files
        ReDim Preserve opts(i)
        someOf = read_whole_file(pathToFile)  ' read the file into variant
        For val = LBound(someOf) To UBound(someOf)  ' run through the array
            ' -- append someOf to allOf and loop
            Dim Nmbr As Integer
            On Error Resume Next
            Err.Clear
            If allOf.Value = "Empty" Then
                Nmbr = UBound(allOf)
                allOf(0) = someOf(0)
            Else
                ReDim Preserve allOf(UBound(allOf) + 1)
                allOf(UBound(allOf)) = someOf(val)
            End If
        Next val
    Next i
End Sub

Function read_whole_file(filePath As String) As Variant
    Dim sWhole As String
    Open filePath For Input As #1
        sWhole = Input$(LOF(1), 1)
    Close #1
    read_whole_file = Split(sWhole, vbNewLine)
End Function

Содержание текстового файла:

» Привет

Это

Текст

Файл «

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

В вашем коде вы говорите, что у вас есть 5 файлов:

   num = 5  ' the number of files I may have

но вы устанавливаете path_to_file непосредственно перед этим. Что еще более важно, вы не изменяете path_to_file в цикле и не передаете модификатор read_whole_file. Таким образом, ваш код будет читать из одного и того же файла 5 раз.

Вы также не устанавливаете любое значение на allOf, прежде чем использовать его. Вы даже не определяете, какой это тип (кроме Variant), поэтому проверка .Value не имеет смысла и должна привести к ошибке компиляции. Из-за вашего заявления On Error этот раздел, вероятно, игнорируется, поэтому предполагаемое действие не происходит.

Как исправить:

  • Добавьте Option Explicit вверху модуля. Всегда .

  • Удалите обработку On Error - если вы считаете, что у вас могут быть некоторые проблемы, выходящие за пределы, то учитывайте это в логике программы.

Бонус : Вместо ReDim ming opts(I) каждый раз в цикле вы уже знаете, сколько итераций, поэтому только ReDim это один раз перед входом в цикл.

0 голосов
/ 26 июня 2019

Это VBA.НЕ используйте массив, используйте коллекцию.

Sub main()

    Dim num As Integer, root As String, pathToFile As String, allOf As Collection, someOf As Variant
    Set allof = new collection
    Dim i As Integer, opts() As String, val As Variant
    root = Application.ActiveWorkbook.Path
    pathToFile = root & "\" & "name" & ".txt"

    num = 5  ' the number of files I may have

    For i = 0 To num - 1  ' loop over all the files

        someOf = read_whole_file(pathToFile)  ' read the file into variant
        For Each val In someOf ' run through the array
            alloff.Add val
        Next
    Next i
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...