2017-11-15 1 views
0

오프셋이있는 While 사이클에 문제가 있습니다.루프주기의 오프셋 문제. 필요한 객체

나는 "폴더의 문자열을 포함하는 시트 사이의 루프에 사이클을 사용하고 있습니다 :

Sub Voucher() 

      Dim rangoCargo, rangoTAG, rangoTipo As Range 
      Dim archivo As String 
      Dim vFound As Boolean 

      Dim subFldr As Object 
      Dim subsubFldr As Object 

      Worksheets("OC").Visible = True 
      Worksheets("OC").Select 

      Set rangoTAG = Range("B2") 
      Set rangoCargo = Range("C2") 
      Set rangoTipo = Range("E2") 

      Dim fso As Object 
      Set fso = VBA.CreateObject("Scripting.FileSystemObject") 

      rutaAño = ActiveWorkbook.Path & "\2017" 
      rutaFARFI = rutaAño & "\FAR_FI" 
      rutaFARTA = rutaAño & "\FAR_TA" 
      rutaFARTN = rutaAño & "\FAR_TN" 
      rutaGOPMTI = rutaAño & "\GOPM_TI" 

      rutaDocumentos = ActiveWorkbook.Path & "\SGSCM\02_ORDENES_DE_COMPRA\"                

      If Dir(ActiveWorkbook.Path & "\2017", vbDirectory) = "" Then 'This checks if a main folder exist, do the procedure, nothing special 

       MsgBox "Please, Check if the [2017] Folder Exists" 

      Else 'if it exists: 

       Do While Not IsEmpty(rangoCargo) 'Starts the cycle 

        If rangoTipo = "C" Then 'If Letter Type is C it loops through a folder until it finds the "C" Like one. 

         rangoCargo = Left(rangoCargo, 6) 

         For Each subFldr In CreateObject("Scripting.FileSystemobject").GetFolder(rutaFARFI).Subfolders 
          For Each subsubFldr In CreateObject("Scripting.FileSystemobject").GetFolder(subFldr).Subfolders 
           Debug.Print subsubFldr 

           vFound = False 

           If subsubFldr Like "*\" & rangoTipo & rangoTAG Then 'If it finds it, copy and move the file from another folder to it. 

            vFound = True 
            cFolder = subsubFldr.Path 

            archivo = Dir(rutaDocumentos & "\" & rangoCargo & "\*.*") 
            Do Until archivo = "" 

             Call fso.copyFile(rutaDocumentos & "\" & rangoCargo & "\" & archivo, cFolder & "\" & archivo) 
             archivo = Dir 

            Loop 

           End If 'ends subsubFldr 

           If vFound = True Then 
            Exit For 
           End If 

          Next subsubFldr 

          If vFound = True Then 
           Exit For 
          End If 
         Next subFldr 

        ElseIf rangoTipo = "P" Then 

         archivo = Dir(rutaDocumentos & "\" & rangoCargo & "\*.*") 
         Do Until archivo = "" 

          Call fso.copyFile(rutaDocumentos & "\" & rangoCargo & "\" & archivo, rutaFARFI & "\" & rangoTipo & "\" & rangoTAG & "\" & archivo) 
          archivo = Dir 
         Loop 

        End If 

        Set rangoTAG = rangoTAG.Offset(1, 0) 
        Set rangoTipo = rangoTipo.Offset(1, 0) 
        Set rangoCargo = rangoCargo.Offset(1, 0) 'THIS OFFSET HAS THE PROBLEM 
       'When the command Set rangoCargo = rangoCargo.Offset(1, 0) executes it throws the next message: Run Time Error '424' object required 

       Loop 'The cycle end when it founds "" 

      End If 'End if the folder [2017] doesn't exists 

     End Sub 

Excel Worksheet (OC)

확인, 문제는 여기 간다 :

이 코드의 "그의 셀 값에서이 경우 문서 Like. 나는 Left (rangoCargo, 6)를 사용하여 정확한 문자 수를 잡아 파일을 복사 할 파일이 들어있는 폴더와 같게하고 나중에 새 폴더로 옮깁니다.

문서 유사 열에서 볼 수 있듯이 첫 번째 값은 "E-0001-997818"입니다. 다른 하위 폴더를 포함하는 주 폴더 인 경우 주 폴더 인 OC을 호출합니다. OC에서 문서를 가져와 검색된 폴더 (IE E-001)로 이동해야하므로 E-001에 새 폴더로 이동해야하는 문서가 포함되어 있지만 E-001은 "Document Like"란 그것들은 그렇게 부르지 만 많은 여분의 숫자 (나는 왜 그런지 모르겠다. 기업이 파일을 나에게 넘겨 준다. 나는 수정하지 않고 그것으로 작업해야한다.). 그래서 나는 그들을 찾기 위해 폴더의 정확한 문자열을 얻기 위해 Left()를했는데 문제가있다. "Object Requires Object"오류를 수정하는 방법을 모르겠다. 나는 그것이 오프셋 때문이라고 거의 확신한다. 그러나 그것을 고치는 방법을 모른다.

어떤 도움도 매우 유용 할 수 있습니다. 시간을 내 주셔서 감사합니다.

+0

'rangoCargo'에 왼쪽 함수가 확인할 문자열이 있는지 확인하는 데 문제가있는 지점에 중단 점을 넣었습니까? –

+0

예, 테스트를 마쳤습니다. 다른 번호가없는 "E-0001"이 있습니다. – Matto

+0

어디에서 문제가 발생 했습니까? 그것은 왼쪽 기능 또는 다른 곳에서 있습니까? 오, 죄송합니다. 당신이 문제를 제기했다는 의견을 발견했습니다. –

답변

0

좋아, 문제가 발견 된 것 같습니다.

이와 같이 변수의 치수를 지정할 때;

Dim rangoCargo, rangoTAG, rangoTipo As Range 

당신은 모든 것이 Range 유형이라고 생각 하겠지만, 이것은 거짓입니다. 처음 두 개는 유형이 모두 선언되지 않았기 때문에 variant 유형이되고 마지막 유형은 Range 유형으로 선언 된 유일한 변수가되기 때문입니다.

선언을 다음 중 하나로 변경해야 코드가 작동합니다.

Dim rangoCargo As Range, rangoTAG As Range, rangoTipo As Range 

또는 rangoCargo 그것은 당신이 오류가 발생하는 이유는 따라서 이유 Range 객체의 것을 모르는 변종으로 선언 된 이후

Dim rangoCargo As Range 
Dim rangoTAG As Range 
Dim rangoTipo As Range 

. 처음으로 변수를 Range("C2")으로 설정하면 실제로 범위를 설정하지 않고 자체 값을 설정합니다. 테스트하려면 처음으로 rangoCargo을 설정 한 직후에이 코드를 추가하면 실패합니다.

p = rangoCargo.Value 

동일한 오류가 발생합니다. Run-time error '424': Object required

희망이 있습니다. 이 방법으로 문제가 해결되면 답을 표시하십시오. 따라서 다른 사람들도 문제를 해결하기 위해해야 ​​할 일을 볼 수 있습니다.

+0

맨, 정말 고마워요! 나는 그 대답이 그렇게 쉽게 될 수 있다고 생각하지 못했습니다. 나머지 모든 코드에서 아무런 문제없이 이런 종류의 선언을했습니다. 당신이 원한다면 (그리고 오직 원한다면) 나는 그런 종류의 일들이 일어나는 이유를 설명하고 싶습니다. 그리고 R. Roe, 시간 내 주셔서 감사합니다! – Matto

+0

변수에 명시 적 선언이 없으므로 설명을 해 주었다고 생각했습니다. 'variant' 개체 유형이 할당되었습니다. http://www.informit.com/articles/article.aspx?p=339929&seqNum=2에는 웹 페이지 하단에 변형 유형이 매우 잘 정의되어 있습니다. 또한 답변으로 표시해야합니다. –