2017-04-17 10 views
1

일부 exif 데이터 (촬영 날짜, 카메라 제조사 및 모델)와 함께 모든 사진을 Excel에서 목록으로 가져오고 싶습니다.폴더의 특정 파일을 처리 할 때 오버플로 오류 6이 발생했습니다.

나는 약 3000 파일의 내 폴더에 대해 그것을 실행하고, 그것의 1796에 완벽하게 갔다.

나는 무슨 일이 일어나고 있는지를 알기 위해 "다음번에 오류 재개"를 주석 처리했다. 내가 폴더에서 이미 처리 된 사진을 이동하면

objExif.Load objFile.Path 

는, 매크로 오류가 밖으로 바로 나머지를 검사 :

나는이 라인에 오류 6 오버플로를 얻었다. 새 폴더에서 이미 처리 된 그림에 대해 매크로를 실행하면 오류가 발생하지 않습니다.

이것은 그림의 두 세트에 대해 다른 것이 있지만 내가 볼 수있는 것은 아무것도 없다는 결론에 도달했습니다. 두 세트는 편집되지 않은 디지털 사진이며 유효한 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 
+0

파일의 크기는 어느 정도입니까? – Kyle

+0

범위는 500 - 9900 kB –

답변

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 
+0

자세한/잘 쓰여진 답을 제공하십시오. 귀하의 질문은 나에게 재미있는 것 같습니다. 좋은 대답은 다른 사용자에게도 도움이 될 수 있습니다. – Masoud

+0

지금 변경된 코드가 추가되었습니다. –

+1

명확히하기 : 내 잘못은 원래 코드에서 메인 하위에 내 "오류 재개시"문을 놓는 것입니다. 오류가 발생하면 (이 경우 손상된 파일) 주 하위는 다음 하위로 다시 진행하여 이후 파일 처리를 종료합니다. 이제 오류 처리기를 파일을 실제로 처리하는 하위에 배치하여 오류가 발생하면 다음 파일을 시도합니다. –