Ошибка переполнения 6 при обработке определенных файлов в папке

Я хотел получить список в Excel всех моих фотографий с некоторыми exif-данными (дата съемки, марка камеры и модель).

Я запустил его для своей папки, содержащей около 3000 файлов, и он отлично подошел для 1796 из них.

Я прокомментировал "возобновление ошибки дальше", чтобы увидеть, что происходит.

Я получил ошибку 6 переполнение в этой строке:

objExif.Load objFile.Path

Если я переместил уже обработанные изображения из папки, макрос сразу выдает ошибки при проверке оставшихся. Если я запускаю макрос для уже обработанных изображений в новой папке, никаких ошибок не возникает.

Это приводит к выводу, что в обоих наборах картинок есть что-то другое, но я ничего не вижу. Оба набора являются цифровыми фотографиями, неотредактированными, с действительными данными exif.

Я надеюсь, что кто-то может помочь мне?

Код:

Private objFSO As Object, objTopFolder As Object, objSubFolder As Object, objFile As Object
Private i As Long
Private objExif As New ExifReader

Sub GetFiles()

    On Error Resume Next

    i = 2
    Worksheets("Filelist").Range("A2:G5000").Value = ""
    Worksheets("Paths").Range("A2:A5000").Value = ""
    Worksheets("Data").Range("E15:E5000").Value = ""

    If Sheets("Data").Range("B2").Value <> "" Then Call Filelist(Sheets("Data").Range("B2").Value, Sheets("Data").Range("C2").Value)
    If Sheets("Data").Range("B3").Value <> "" Then Call Filelist(Sheets("Data").Range("B3").Value, Sheets("Data").Range("C3").Value)
    If Sheets("Data").Range("B4").Value <> "" Then Call Filelist(Sheets("Data").Range("B4").Value, Sheets("Data").Range("C4").Value)
    If Sheets("Data").Range("B5").Value <> "" Then Call Filelist(Sheets("Data").Range("B5").Value, Sheets("Data").Range("C5").Value)
    If Sheets("Data").Range("B6").Value <> "" Then Call Filelist(Sheets("Data").Range("B6").Value, Sheets("Data").Range("C6").Value)
    If Sheets("Data").Range("B7").Value <> "" Then Call Filelist(Sheets("Data").Range("B7").Value, Sheets("Data").Range("C7").Value)
    If Sheets("Data").Range("B8").Value <> "" Then Call Filelist(Sheets("Data").Range("B8").Value, Sheets("Data").Range("C8").Value)
    If Sheets("Data").Range("B9").Value <> "" Then Call Filelist(Sheets("Data").Range("B9").Value, Sheets("Data").Range("C9").Value)
    If Sheets("Data").Range("B10").Value <> "" Then Call Filelist(Sheets("Data").Range("B10").Value, Sheets("Data").Range("C10").Value)
    If Sheets("Data").Range("B11").Value <> "" Then Call Filelist(Sheets("Data").Range("B11").Value, Sheets("Data").Range("C11").Value)

    Sheets("Filelist").Range("G1:G10000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Data").Range("E15"), Unique:=True
    Sheets("Filelist").Range("B2").Select
End Sub

Sub Filelist(TopFolder As String, includesub As String)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTopFolder = objFSO.GetFolder(TopFolder)
    If includesub = "yes" Then
        Call RecursiveFolder(objTopFolder, True)
    Else
        Call RecursiveFolder(objTopFolder, False)
    End If
End Sub

Sub RecursiveFolder(objFolder As Scripting.Folder, IncludeSubFolders As Boolean)
    For Each objFile In objFolder.Files
        If Right(objFile.Name, 3) = "jpg" Or Right(objFile.Name, 3) = "JPG" Then
            objExif.Load objFile.Path
            txtDate = objExif.Tag(DateTimeOriginal)
            txtmake = objExif.Tag(Make)
            txtmodel = objExif.Tag(Model)
            Worksheets("Filelist").Cells(i, 1) = objFile.Path
            Worksheets("Paths").Cells(i, 1) = objFile.Path
            Worksheets("Filelist").Cells(i, 2) = objFile.Name
            Worksheets("Filelist").Cells(i, 3) = txtDate
            Worksheets("Filelist").Cells(i, 4) = txtmake
            Worksheets("Filelist").Cells(i, 5) = txtmodel
            Worksheets("Filelist").Cells(i, 7) = Left(txtDate, 4)
            i = i + 1
        End If
    Next objFile

    If IncludeSubFolders Then
        For Each objSubFolder In objFolder.SubFolders
            Call RecursiveFolder(objSubFolder, True)
        Next objSubFolder
    End If
End Sub

1 ответ

Хорошо, нашел его после еще нескольких копаний.

Я переместил оператор "on error" в другую подпрограмму (ту, которая фактически выполняет всю работу), чтобы при ошибке загружался следующий файл, а не пропускал подпрограмму полностью.

Все файлы, кроме одного, были обработаны.

Этот файл оказался поврежден.

Private objFSO As Object, objTopFolder As Object, objSubFolder As Object, objFile As Object
Private i As Long
Private objExif As New ExifReader

Sub GetFiles()
    i = 2
    Worksheets("Filelist").Range("A2:G5000").Value = ""
    Worksheets("Paths").Range("A2:A5000").Value = ""
    Worksheets("Data").Range("E15:E5000").Value = ""

    If Sheets("Data").Range("B2").Value <> "" Then Call Filelist(Sheets("Data").Range("B2").Value, Sheets("Data").Range("C2").Value)
    If Sheets("Data").Range("B3").Value <> "" Then Call Filelist(Sheets("Data").Range("B3").Value, Sheets("Data").Range("C3").Value)
    If Sheets("Data").Range("B4").Value <> "" Then Call Filelist(Sheets("Data").Range("B4").Value, Sheets("Data").Range("C4").Value)
    If Sheets("Data").Range("B5").Value <> "" Then Call Filelist(Sheets("Data").Range("B5").Value, Sheets("Data").Range("C5").Value)
    If Sheets("Data").Range("B6").Value <> "" Then Call Filelist(Sheets("Data").Range("B6").Value, Sheets("Data").Range("C6").Value)
    If Sheets("Data").Range("B7").Value <> "" Then Call Filelist(Sheets("Data").Range("B7").Value, Sheets("Data").Range("C7").Value)
    If Sheets("Data").Range("B8").Value <> "" Then Call Filelist(Sheets("Data").Range("B8").Value, Sheets("Data").Range("C8").Value)
    If Sheets("Data").Range("B9").Value <> "" Then Call Filelist(Sheets("Data").Range("B9").Value, Sheets("Data").Range("C9").Value)
    If Sheets("Data").Range("B10").Value <> "" Then Call Filelist(Sheets("Data").Range("B10").Value, Sheets("Data").Range("C10").Value)
    If Sheets("Data").Range("B11").Value <> "" Then Call Filelist(Sheets("Data").Range("B11").Value, Sheets("Data").Range("C11").Value)

    Sheets("Filelist").Range("G1:G10000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sheets("Data").Range("E15"), Unique:=True
    Sheets("Filelist").Range("B2").Select
End Sub

Sub Filelist(TopFolder As String, includesub As String)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTopFolder = objFSO.GetFolder(TopFolder)
    If includesub = "yes" Then
        Call RecursiveFolder(objTopFolder, True)
    Else
        Call RecursiveFolder(objTopFolder, False)
    End If
End Sub

Sub RecursiveFolder(objFolder As Scripting.Folder, IncludeSubFolders As Boolean)
    On Error Resume Next
    For Each objFile In objFolder.Files
        If Right(objFile.Name, 3) = "jpg" Or Right(objFile.Name, 3) = "JPG" Then
            objExif.Load objFile.Path
            txtDate = objExif.Tag(DateTimeOriginal)
            txtmake = objExif.Tag(Make)
            txtmodel = objExif.Tag(Model)
            Worksheets("Filelist").Cells(i, 1) = objFile.Path
            Worksheets("Paths").Cells(i, 1) = objFile.Path
            Worksheets("Filelist").Cells(i, 2) = objFile.Name
            Worksheets("Filelist").Cells(i, 3) = txtDate
            Worksheets("Filelist").Cells(i, 4) = txtmake
            Worksheets("Filelist").Cells(i, 5) = txtmodel
            Worksheets("Filelist").Cells(i, 7) = Left(txtDate, 4)
            i = i + 1
        End If
    Next objFile

    If IncludeSubFolders Then
        For Each objSubFolder In objFolder.SubFolders
            Call RecursiveFolder(objSubFolder, True)
        Next objSubFolder
    End If
End Sub
Другие вопросы по тегам