将数组传递给应填充它的函数时出现错误 13

Error 13 when passing an array to a function that should fill it

首先:我是 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 函数,它接受一个字符串并剪切掉它的某个部分和 returns 这部分。如前所述,当我在填充数组之外使用它时,这个函数工作得很好。

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

希望对你有所帮助

在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

我想我明白了!我正在使用变量 "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

解决了问题。感谢大家的帮助! :)