2013-04-19 3 views
0

Я получаю runtime errror 53: файл не найден для 27-го-28-го элемента. Любая идея, что не так?Как игнорировать ошибку и продолжить цикл?

Ошибка заключается в:

"FileCopy Источник: = SourcePath, Destination: = DestinationPath"

Option Base 1 
Sub LoopThroughFolder() 

    Const FileSpec As String = "*.xls" 
    Dim y As Integer 
    Dim MyFolder As String 
    Dim MyFile As String 
    Dim iDot As Integer 
    Dim FileRoot As String 
    Dim FileExt As String 

    Dim SourcePath As String 
    Dim DestinationPath As String 

    Dim ArrayData() As Variant 
    Dim Series() As Integer 


    'Capture the filename information 
    For y = 2009 To 2030 
     ReDim Preserve ArrayData(12, y) 
     ReDim Preserve Series(12, y) 
     MyFolder = ActiveWorkbook.Path & "\" & y & "\" 

     i = 1 
     MyFile = Dir(MyFolder & FileSpec) 
     Do While Len(MyFile) > 0 
      iDot = InStrRev(MyFile, ".") 

      If iDot = 0 Then 
       FileRoot = MyFile 
       FileExt = "" 
      Else 
       FileRoot = Left(MyFile, iDot - 1) 
       FileExt = Mid(MyFile, iDot - 1) 
      End If 

      MyFile = Dir 
      ArrayData(i, y) = FileRoot 
      i = i + 1 
     Loop 
    Next y 

    'Conversion from MMMYY to numerical sequence 
    a = 1 
    BasicPath = ActiveWorkbook.Path 
    For y = 2009 To 2030 
     For i = 1 To 12 
      If Not IsEmpty(ArrayData(i, y)) Then 
       Series(i, y) = a 
       a = a + 1 

       SourcePath = BasicPath & "\" & y & "\" & ArrayData(i, y) & ".xls" 
       DestinationPath = BasicPath & "\output\" & "Bill_Summary_Report_" & Series(i, y) & ".xls" 

       FileCopy Source:=SourcePath, Destination:=DestinationPath 

      Else 
       x = 0 
      End If 
     Next i 
    Next y 

End Sub 
+0

Каким был ваш вопрос, на самом деле? «Почему я получаю сообщение об ошибке?» Или «Хорошо, мне все равно, что это такое; как я могу пропустить это? »_ Это две разные вещи, но ваш заголовок говорит один, а ваше сообщение говорит другое. –

ответ

1

попробовать

Sub LoopThroughFolder() 
    on error resume next 
    ..... 
+0

работает как очарование. в чем причина ошибки? –

+0

Я не волшебник) Я не знаю, что есть в ваших папках) – shibormot

+0

@TingPing Это правильный вопрос: в чем причина ошибки. Этот код буквально просто игнорирует ошибку и продолжает. Наверное, не то, что ты хочешь. Это похоже на прилипание головы в песок и притворство, что небо не падает вокруг вас. [Документация для FileCopy] (http://msdn.microsoft.com/en-us/library/2s1c774y.aspx) дает вам список вещей, которые могут пойти не так и заставить функцию сбой. Скорее всего, это «IOException», указывающее, что файл в настоящее время открыт/используется и не может быть скопирован. –

0

Я добавил функцию FileExist, которая будет true, если существует путь. Перед этой строкой «FileCopy Source: = SourcePath, Destination: = DestinationPath» называется всегда лучше проверять их существование, и если да, то продолжайте с файлоскопией.

Option Base 1 Sub LoopThroughFolder()

Const FileSpec As String = "*.xlsm" 
    Dim y As Integer 
    Dim MyFolder As String 
    Dim MyFile As String 
    Dim iDot As Integer 
    Dim FileRoot As String 
    Dim FileExt As String 

    Dim SourcePath As String 
    Dim DestinationPath As String 

    Dim ArrayData() As Variant 
    Dim Series() As Integer 


    'Capture the filename information 
    For y = 2009 To 2030 
     ReDim Preserve ArrayData(12, y) 
     ReDim Preserve Series(12, y) 
     MyFolder = ActiveWorkbook.path & "\" & y & "\" 

     i = 1 
     MyFile = Dir(MyFolder & FileSpec) 
     Do While Len(MyFile) > 0 
      iDot = InStrRev(MyFile, ".") 

      If iDot = 0 Then 
       FileRoot = MyFile 
       FileExt = "" 
      Else 
       FileRoot = Left(MyFile, iDot - 1) 
       FileExt = Mid(MyFile, iDot - 1) 
      End If 

      MyFile = Dir 
      ArrayData(i, y) = FileRoot 
      i = i + 1 
     Loop 
    Next y 

    'Conversion from MMMYY to numerical sequence 
    a = 1 
    BasicPath = ActiveWorkbook.path 
    For y = 2009 To 2030 
     For i = 1 To 12 
      If Not IsEmpty(ArrayData(i, y)) Then 
       Series(i, y) = a 
       a = a + 1 

       SourcePath = BasicPath & "\" & y & "\" & ArrayData(i, y) & ".xls" 
       DestinationPath = BasicPath & "\output\" & "Bill_Summary_Report_" & Series(i, y) & ".xls" 

       If fileExist(SourcePath) And fileExist(DestinationPath) Then 
        FileCopy Source:=SourcePath, Destination:=DestinationPath 
       End If 

      Else 
       x = 0 
      End If 
     Next i 
    Next y 

End Sub 

Function fileExist(path As String) As Boolean 
    On Error Resume Next 

    Dim file As String 
    file = Dir(path) 

    If file <> "" Then fileExist = True 

    On Error GoTo 0 
End Function 
+0

Что вы здесь изменили? Почему это устраняет проблему? Нам не нужно разграничивать сам код, чтобы узнать. (Хотя я и сделал, и ваш код страдает от состояния гонки. Проверка наличия файла перед выполнением файла IO практически бесполезна, и файл может исчезнуть между временем выполнения проверки и временем выполнения операции ввода-вывода. просто нужно обрабатывать ошибки.) –

+0

Проверка существования файла перед выполнением файла IO практически бесполезна. Почему ты так думаешь? – Santosh

+0

Я объяснил это. Он страдает от состояния гонки. Файл может исчезнуть между временем выполнения проверки и временем выполнения операции ввода-вывода. Это приведет к сбою операции ввода-вывода, как если бы вы не потрудились проверить. –

Смежные вопросы