2017-11-15 10 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)

[OK]を、ここで問題を行く:

私は「フォルダの文字列が含まれているシートとの間のループにサイクルを使用していますが、 "彼のcellValueで、この場合文書のように。私はLeft(rangoCargo、6)を実行して、文字をコピーして後で新しいフォルダに移動するファイルが入っているフォルダに等しい文字数を正確にキャッチしました。

文書のような列に表示されているように、最初の値は "E-0001-997818"です。別のサブフォルダを含むメインフォルダは、メインフォルダOCと呼ばれます。 OCからは、文書を取得してそれを検索したフォルダ(IE E-001)に移動する必要があるので、E-001には新しいフォルダに移動する必要がある文書が含まれていますが、E-001はそのように呼び出されます彼らはそれほど呼び出されているが、余分な数字がたくさんある(私は理由を知らないので、企業はExcelファイルを私に与え、私はそれを修正せずに作業しなければならない)。 私は、それらを見つけるためのフォルダの正確な文字列を取得するために左()を行った、問題がある、私は "それはオブジェクトが必要です"エラーを修正する方法を知らない。 私はほとんどがオフセットのためだと確信していますが、私はそれを修正する方法がわかりません。

だから、どんな助けも非常に役に立つかもしれません。時間を過ごしてくれてありがとう。

+0

左の関数をチェックするために 'rangoCargo'に文字列が含まれているかどうか確認するのに問題があることを示す点にブレークポイントを設定しましたか? –

+0

はい、私はすでにそれをテストしました、それは "E-0001"を持っています。 – Matto

+0

正確にどこが壊れているのか、問題があるのですか?それは左の関数か他のどこかにありますか?オハイオ州申し訳ありません私はあなたが問題を抱えていると言ったあなたのコメントを発見した。 –

答えて

0

あなたの問題が見つかりました。

このような変数をディメンション化すると、

Dim rangoCargo, rangoTAG, rangoTipo As Range 

あなたはすべてがタイプRangeだと思うでしょうが、これは誤りです。最初の2つはタイプがvariantで、いずれのタイプも宣言されておらず、最後はRangeタイプとして宣言された唯一の変数になるためです。

宣言を次のいずれかに変更して、コードが機能するはずです。

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

または

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

rangoCargoは、それはそれは、したがって、あなたがエラーを取得している理由Rangeオブジェクトだということを知っていないバリアントとして宣言されたため。最初に変数をRange("C2")に設定すると、実際には範囲が設定されていませんが、その値は自己に設定されます。テストするには、最初にrangoCargoを設定した直後にこのコードを追加すると失敗します。

p = rangoCargo.Value 

同じエラーが表示されます。 Run-time error '424': Object required

希望に役立ちます。これにより問題が解決され、回答としてマークされるかどうかを覚えておいてください。他の人は、問題を解決するために何をすべきかを知ることができます。

+0

男、ありがとう!私は答えがとても簡単だとは決して考えなかった。私は他のすべてのコードでこの種の宣言を何の問題もなくしました。 もしあなたが(そしてあなたが望むのであれば)私はそのようなことが起こる理由を説明したいと思う。 また、R. Roe、お時間をありがとう! – Matto

+0

私は変数に明示的な宣言がないので、説明したと思いました。 http://www.informit.com/articles/article.aspx?p=339929&seqNum=2には、ウェブページの下部にバリアントタイプの定義が非常によくあります。また、回答としてマークすることを忘れないでください。 –

関連する問題