Ошибка 13 при передаче массива в функцию, которая должна его заполнить - PullRequest
0 голосов
/ 06 марта 2019

Прежде всего: я довольно новичок в VBA, поэтому, пожалуйста, извините меня, если вопрос довольно тривиален, но из-за этой ошибки я занимался весь день - у меня нет абсолютно никакой подсказки.

Яработая над небольшим макросом, чтобы просмотреть папку, сосчитать файлы и заполнить двумерный массив полным именем файла и определенным разделом имени.Поэтому я создаю массив в моей основной подпрограмме и вызываю функцию, которая принимает пустой массив в качестве параметра и заполняет его.

Мой макрос выглядит примерно так:

Private Sub whatever()
    Dim arr(10, 2) As String
    Dim count As Integer
    CheckFolder(arr, "somepath", count)
End Sub

Sub CheckFolder(ByRef arr() As String, strPath As String, count As Integer)

    Dim fso, oFolder, oSubfolder, oFile, queue As Collection
    Set fso = CreateObject("Scripting.FileSystemObject")

    Dim fileCount As Integer
    Dim temp(10, 2) As String
    fileCount = 1

    WriteToLog "zähle Files in Ordner " & strPath & "... "

    Dim path As String
    path = ActiveWorkbook.path & "\" & strPath
    Set queue = New Collection
    queue.Add fso.GetFolder(path) '- Pfad zum Ordner

    Do While queue.count > 0
        Set oFolder = queue(1)
        FolderName = fso.GetFileName(oFolder)
        queue.Remove 1 'dequeue
        For Each oSubfolder In oFolder.SubFolders
          queue.Add oSubfolder 'enqueue
        Next oSubfolder
        For Each oFile In oFolder.Files
            Filename = fso.GetFileName(oFile)
            '- my guess is the next two line are the problem?
            temp(fileCount, 1) = Filename
            temp(fileCount, 2) = StringCutter(Filename)
            fileCount = fileCount + 1
        Next oFile
    Loop

    arr = temp
    count = fileCount

End Sub

Я не уверен, но я думаю, что эти две строки - проблема (поскольку остальная часть логики работала совершенно нормально раньше)

temp(fileCount, 1) = Filename
temp(fileCount, 2) = StringCutter(Filename)

Функция "StringCutter", которая вызывается здесь, вернула подстроку имени файла.Я тестировал эту функцию раньше, и я работаю, поэтому я не думаю, что это вызывает какие-либо проблемы.

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

РЕДАКТИРОВАТЬ: это функция StringCutter, которая берет строку, вырезает определенную ее часть и возвращает эту часть.Как упоминалось ранее, эта функция прекрасно работает, когда я использую ее вне заполнения массива.

Function StringCutter(str As String) As String

    Dim ret As String
    Dim retLen As Integer
    Dim pos As Integer

    retLen = Len(str)
    ret = Right(str, (retLen - 31))
    pos = InStr(ret, "_")

    If (pos > 0) Then
        ret = Left(ret, (pos - 1))
    Else
        ret = Left(ret, 4)
    End If

    StringCutter = ret

End Function

Надеюсь, это поможет

Ответы [ 2 ]

1 голос
/ 07 марта 2019

В VBA я не думаю, что вы можете скопировать один массив в другой, как это - arr = temp - вы можете использовать массивы диапазонов, но не чистые массивы.Вам нужно перебрать все значения и скопировать по одному:

For y = LBound(temp, 2) To UBound(temp, 2)
    For x = LBound(temp, 1) To UBound(temp, 1)
        arr(x, y) = temp(x, y)
    Next
Next
0 голосов
/ 07 марта 2019

Кажется, я понял это!Я использовал переменную «Filename», которая, как мне кажется, была из элемента oFile, потому что я ее не создавал.Может быть, поэтому типы не были совместимы.Создание Dim fileName AS String и использование этой переменной здесь:

For Each oFile In oFolder.Files
        fileName = fso.GetFileName(oFile)
        temp(fileCount, 1) = fileName
        temp(fileCount, 2) = StringCutter(fileName)
        fileCount = fileCount + 1
 Next oFile

решило проблему.Спасибо за вашу помощь!:)

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