2016-10-18 11 views
2

ディレクトリ内のサブフォルダをループする外部ループを使用するだけです。&は、そのサブフォルダ内のファイルを反映する各サブフォルダにマスターファイルを作成します。ファイル構造はすべて同じですので、各サブフォルダ内のすべてのファイルから蓄積されたすべてのデータを保持するマスターファイル用のテンプレートとして1つのファイルのみを必要とします。他のフォルダのファイル構造が異なるので、各サブフォルダにマスターファイルが必要です。VBA内部ループを終了しますが、内部ループに戻ります

内部ループサブフォルダ内のファイルの1つをファイルのヘッダと名前(名前& "マスタ"をファイル名に変更)にコピーしたいだけなので、 'exit for'を使用するとループが戻りますもう一度内側のループに戻り、必要のない他のすべてのファイルをループします。

これを行うにはより良い方法がありますが、これは私が持っているものであり、内側のループが外側のループに戻って、なぜステートメントを終了するときに次のサブフォルダに戻るのか内部のループで?

私はちょうど外側のループを使って各フォルダを初期化しています。内側のループを呼び出すことを除いて、このループ内では何もしません。すべての建設的なフィードバックのための

Sub DoFolder(Folder) 
Dim SubFolder 
For Each SubFolder In Folder.SubFolders 

    Dim IsExecuted As Boolean 
    Dim Item 
    Dim filename 
    Dim lastcol As Integer 
    For Each Item In SubFolder.Files **<<<< returns here** 
     If Not IsExecuted Then 
      Exit For 
     Else 
      filename = Item.Name 
      Call CreateMasterCopy(removename(filename), strStartDir, SubFolder.Name) 


      Call findcolumncount(Item) 
      IsExecuted = True 
     End If 
    Next 
Next **<<<< returns to inner loop from here** 


End sub 

おかげ

アンドリュー

EDIT:今すぐ下記のコードはまさに私が今行って内部ループで何をしたいん。

Sub DoFolder(Folder) 
Dim SubFolder 
Dim filename As String 
For Each SubFolder In Folder.SubFolders 

    'search for file with Pattern at end to load this file into the filename variable 
    filename = Dir(SubFolder & "\* - MyPattern.csv") 

      Call CreateMasterCopy(removename(filename), strStartDir, SubFolder.Name) 


Next 
End Sub 
+0

'Exit For'がヒットした場合、マクロは' SubFolder'ではなく、 'Item'の次の項目に移動します。 – BruceWayne

+0

これは内側のループに戻りますが、 'SubFolder'は次のループです。それは何を期待していますか? –

+0

@ mats-mugサブフォルダの外側ループに戻り、次のサブフォルダにファイルを開きたいと思います。 – Andrew

答えて

1

Exit Forは、現在のループを終了します。今すぐ現在のループは別のものの中にあるので、完全に飛び出す方法が必要です。

の手順(そのループを超えて実行可能なものではないようです)を終了する場合は、代わりにExit Subを使用してください。

それ以外の場合(たとえば、その外側ループの後にコードがある場合)、外側ループにも別の終了メカニズムが必要です(たとえば、If IsExecuted Then Exit For)。

しかし、あなたのコードはそれよりも壊れています。

IsExecutedBooleanと宣言されているため、Falseに初期化されています。これは、Not IsExecutedTrueと評価されているため、すべてのループが入力してからすぐに終了することを意味します。

コードの重要な部分を削除していない限り、すべてのことは厳密には行われませんが、各項目はFolder.Subfoldersで繰り返されます。

Dim文がいずれかの実行可能ではない、とVBAで可能な最小のスコープはプロシージャレベルであることに注意してください - これらの変数:

Dim IsExecuted As Boolean 
Dim Item 
Dim filename 
Dim lastcol As Integer 

がそれぞれに再初期化されませんそれらは、SubFolderとまったく同じ範囲にあります。

+0

内部ループを取り出すと、デバッガは実際には戻ってこないforセクションには、それ以降の文、この場合はmsgboxというサブフォルダが表示されます。今私はコードが外側のループに戻っていたが、それは他の項目(ファイル)と内部ループであり、それらを介してループを続けて次のステートメントに行くことを理解します。私は理想的には、フォルダからファイルのいずれかを選択し、必要なものだけを選択し、次のサブフォルダにループすることができるステートメントに内部ループを変更したいと思います。 – Andrew

関連する問題