Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Excel 2013)
特定のフォルダ階層の全ファイルにてVBAを実行させたい
投稿日時: 17/06/08 16:11:54
投稿者: たけっしー

こんにちわ。初めて投稿させていただきます。
 
特定のフォルダ階層の全ファイルにてVBAを実行させたいのですが、
やり方が分からず古今奮闘しています。
 
私のやりたいことですが、以下のようなフォルダ構成を例に説明します。
 
c:\work の下に 
 
work2
work3
work4
 
といったサブフォルダがあり、その各フォルダのしたにEXCELファイルが複数あると
仮定し、work2配下の全EXCELのみコードを実行させたいです。
 
因みに今は
 
Sub Macro1()
 Dim myPath As String
 Dim myFile As String
 Dim ws As Workbook
 myPath = ThisWorkbook.Path & "\"
 myFile = Dir(myPath & "*.xls*")
 Application.ScreenUpdating = False
 Do Until myFile = ""
 If myFile <> ThisWorkbook.Name Then
 Set wb = Workbooks.Open(myPath & myFile)
 
------------------------------------------
※ここに各ファイルで実行したいコードを羅列
------------------------------------------
 
End If
myFile = Dir()
 Loop
 Application.ScreenUpdating = True
 
 End Sub
 
 
このようなものを今は使っておりますが、これだと操作したい複数のEXCELファイルのある
階層に実行するマクロ入りのEXCELファイルを入れて毎度毎度実行していますが、
非常に手間なので、一括でコードを実行させたいと思っています。
 
よろしければ、どなたかお知恵を拝借できたら幸いです。
宜しくお願い申し上げます。
 

投稿日時: 17/06/08 16:15:07
投稿者: たけっしー

すいません。1点補足です。
 
 
work2 のみ と上記で記載しましたが、
複数のフォルダで複数のEXCELを操作したいので、
 
work2 work3 と対象のフォルダを複数にさせてください。
 
度々すみません。

回答
投稿日時: 17/06/08 16:31:42
投稿者: カリーニン

ヒントだけになりますが・・・。
 
FileSystemObjectを使ってSubFolderを取得し,そのSubFolderに対して
処理を行う。
 
ダイアログで処理を行うフォルダを選択して処理を行う
 
などの方法があります。

回答
投稿日時: 17/06/09 11:51:26
投稿者: Suzu

私だったら。
 
シートに処理したい(したくない)フォルダ名の一覧を作成し
そのリストを元に、サブフォルダ名をマッチングし処理するかどうか判断。
 
 
フォルダ名を変える事が許されるなら
フォルダ名に規則性を持たせて処理分岐
 
処理頻度がどれくらいか判りませんが
ユーザーにフォルダを「複数」選択しろって、けっこう こく かと。。
(選択間違えた時、また一から選択し直しが萎える。。)

回答
投稿日時: 17/06/10 11:54:53
投稿者: simple

こんにちは。
 
・フォルダを指定するという作業、
・指定されたフォルダに対して、その配下のExcelに何らかの処理を行うこと。
の二つを切り離すとよいかもしれません。
具体的には、サブプロシージャの活用ということです。
 
(1)まず、今の処理をサブプロシージャーにまとめます。
 

' folder(指定したパス)の配下にあるすべてのExelファイルに対して処理を実行
Sub 処理(folder As String)
    Dim myFile As String
    Dim wb As Workbook

    If Right(folder, 1) <> "\" Then folder = folder & "\"

    myFile = Dir(folder & "*.xls*")
    Application.ScreenUpdating = False
    Do Until myFile = ""
        If myFile <> ThisWorkbook.Name Then ' この扱いは微妙。要検討
            Set wb = Workbooks.Open(folder & myFile)
            ' ------------------------------------------
            ' ※ここに各ファイルで実行したいコードを羅列
            '------------------------------------------
        End If
        myFile = Dir()
    Loop
    Application.ScreenUpdating = True
End Sub

(2)次に、フォルダを指定することを考えます。
指定したフォルダに対して、上で作ったサブプロシージャを実行させます。
 
Sub test1() ' 固定のフォルダが対象ならこんな風に書いてもよいのでは?
    Call 処理("C:\work\work2")
    Call 処理("C:\work\work3")
End Sub

Sub test2() 'その都度、フォルダを指定するならこちら。これを必要回数繰り返す。
    '' 参照:  http://officetanaka.net/excel/vba/tips/tips39.htm
    Dim folder As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            folder = .SelectedItems(1)
            Call 処理(folder)
        End If
    End With
End Sub

回答
投稿日時: 17/06/12 08:16:18
投稿者: mattuwan44

ども^^
 
>操作したい複数のEXCELファイルのある
>階層に実行するマクロ入りのEXCELファイルを入れて毎度毎度実行しています

 
とりあえず、自動実行する上(マクロの中)で、目視でファルダーを選択出来たらいいのでは?
 
http://officetanaka.net/excel/vba/tips/tips39.htm
http://www.relief.jp/docs/excel-vba-select-folder.html
http://www.k1simplify.com/vba/tipsleaf/leaf260.html

投稿日時: 17/06/21 10:41:57
投稿者: たけっしー

皆さま 返信遅れてしまい、申し訳ありません。
 
カリーニン さま
 
ヒントを頂きありがとうございます。参考にさせて頂きます。
 
Suzu さま
 
私が各ファイルの修正を行うので、ユーザーに意識して
作る必要はないですね。
因みにやりたいことはSuzuさまが仰っている方法でできそうです。
ありがとうございます。
 
 
simple さま
コードまで書いて頂きありがとうございます。
一度私の方で試させていただきます。
 
n44 さま
現状はその方法でフォルダを選択し、その配下でコードを実行するようにしています。
(というかそれしか今は出来てません・・・)
simpleさまが上記で仰ってているやり方が個人的にはベストかと思っています。
 
ただ、ご回答頂き本当助かります。ありがとうございます。
 
 
みなさまありがとうございます。
たいへん助かっています。
 
 
 
 
 

回答
投稿日時: 17/06/24 12:15:25
投稿者: simple

>一度私の方で試させていただきます。
結果はいかがですか?
さほど難しいテスト作業とも思えません。
余り時間を置くと、ご自分が忘れてしまいませんか?
また、疑問点があるなら、それを明確にしていただきたいです。
 
中途半端にしたままにせず(将来、時間がとれなさそうなら、その旨を宣言されるとか)
ある程度のリズムで区切りをつけていくことも、
こうした質問掲示板をうまく活用する際のコツですね。

トピックに返信