【问题标题】:Error 13 when passing an array to a function that should fill it将数组传递给应填充它的函数时出现错误 13
【发布时间】:2019-07-28 13:48:12
【问题描述】:

首先:我是 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

希望对你有帮助

【问题讨论】:

  • 你得到什么错误,在哪一行? filecount 出错时的值是多少?
  • 你也可以发布你的StringCutter函数吗?
  • 运行代码时究竟会发生什么?
  • @SJR:我收到错误 13:“类型不匹配”。当我尝试执行“arr = temp”时,我的宏跳转到错误例程。
  • @AlexdeJong:我编辑了我的帖子并添加了功能。希望有帮助

标签: arrays excel vba string byref


【解决方案1】:

在 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

【讨论】:

  • absolutely can直接复制数组。它们唯一的限制是它们不能固定大小,arr 是。
  • 另外,请注意文件名少于 32 个字符的文件夹 - 您应该考虑在 StringCutter 中捕获这种可能性,这样您就不会试图缩短超出其长度的内容。
  • 尽管该函数也被构建为遍历文件夹,但该函数只会在其中包含具有相同名称的文件的一个文件夹上调用,因此会计算 -31。但我知道,硬编码这样的功能并不是最好的风格。
【解决方案2】:

我想我明白了!我正在使用变量“文件名”,我猜它来自 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

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

【讨论】:

  • 我看不出这将如何帮助解决arr = temp 上的错误。您不能直接分配给固定大小的数组。
  • 嗨@GSerg,我可以帮忙,因为现在我不需要 temp 并且有了 arr=temp。我可以将数组 arr 作为参数传入并直接填充它,而不再使用临时数组。我的问题是我在填充数组时尝试使用非字符串变量。至少我认为这是问题所在。我对 VBA 很陌生,所以我不太确定自己在做什么,但至少现在我的 sub 填充了传递的数组而没有任何错误
  • 如果你不声明一个变量,它总是一个变体。使用Option Explicit,它强制执行预先声明的变量。
  • 感谢您的提示!这意味着我可以在我的代码中使用任何变量而无需声明它,而 vba 只会使它成为一个变体?
  • 你可以,但你不应该这样做,因为错别字会发生,而且如果没有Option Explicit,调试是一场噩梦。
猜你喜欢
  • 2014-12-10
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多