将数组传递给应填充它的函数时出现错误 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
解决了问题。感谢大家的帮助! :)
首先:我是 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
解决了问题。感谢大家的帮助! :)