Прежде всего: я довольно новичок в 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
Надеюсь, это поможет