Excel (VBA)

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

 
(Windows 10 Home : Excel 2016)
フォルダの中に入ったすべてのブックのマクロを実行する
投稿日時: 18/12/06 16:25:37
投稿者: 雲取山

フォルダの中にマクロブックが100以上あります。すべてのブックの同じマクロが仕込んであります。一般的には、別のブックのマクロを動かすには、
Sub Test1()
    Application.Run "Book2!Test2"
End Sub
のようにパスをつけると思います。
 
ただし、該当するフォルダには、100以上のブックがあり、一括してそれぞれのブックのマクロを動かしたいと思うのですが、そもそも、そうしたことができるのでしょうか。ご教示願います。

投稿日時: 18/12/06 16:28:22
投稿者: 雲取山

補足です。
 
すべてのブックのマクロは同一です。
ファイル名は都度変更されます。

回答
投稿日時: 18/12/06 18:07:06
投稿者: Suzu

Dir 関数 を調べてみましょう。

回答
投稿日時: 18/12/06 18:13:20
投稿者: WinArrow
投稿者のウェブサイトに移動

参考コード
Option Explicit
 
Dim TargetBook As Workbook, F
Const FolderName As String = "D:\TEST" 'ここにフォルダパスを定義してください
 
Sub 対象ブックを開く()
    With CreateObject("Scripting.Filesystemobject")
        For Each F In .GetFolder(FolderName).Files
            If F.Name Like "*.xlsm" Then
                Call MacroGO(FPATH:=F.Path)
            End If
        Next
     
    End With
 
End Sub
 
Sub MacroGO(ByVal FPATH As String)
 
    Set TargetBook = Workbooks.Open(FPATH)
    Application.Run TargetBook.Name & "!Macro1"
    TargetBook.Close False
 
End Sub

投稿日時: 18/12/07 11:35:01
投稿者: 雲取山

 WinArrow様
 
難しい課題を教えてくださり、ありがとうございます。
こちらで、コードを試してみたのですが、
 
実行時エラー'1004’
Excelファイル'$〜.xlsm'を開くことができません。ファイル形式または
ファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル
形式が一致していることを確認してください。
 
とのダイアログが出てデバッグを開きますと、
 
Sub MacroGO(ByVal FPATH As String)
  
    ⇒Set TargetBook = Workbooks.Open(FPATH) 
 
の部分で処理が止まってしまうようです。
どうしてなんでしょうか。マクロ有効ブックだからなのでしょうか?

回答
投稿日時: 18/12/07 13:43:52
投稿者: なと

引用:

Excelファイル'$〜.xlsm'を開くことができません。

 
もしかしてファイル名は「~$・・・・・.xlsm」ではありませんか?
それならエクセルブックのロックファイルなので開く必要が無いファイルです。
 
そのようなファイルを開かないように、If文に手を加えれば良いかと・・・
            If F.Name Like "*.xlsm" And Not F.Name Like "~$*" Then

回答
投稿日時: 18/12/09 15:53:01
投稿者: WinArrow
投稿者のウェブサイトに移動

もしかして
実行しているマクロブックも、指定のフォルダに保存されていますか?
     
その場合は、自ブックは、非対象とする必要があります。
     
    > If F.Name Like "*.xlsm" Then
    > Call MacroGO(FPATH:=F.Path)
    > End If
    ↓
              If F.Name <> Thisworbook.Name And _
                  F.Name Like "*.xlsm" And _
                  Not F.Name Like "~$*" Then '←「なと」さんアドバイス
                   Call MacroGO(FPATH:=F.Path)
              End If
    
 
※条件
1つ目の条件:自ブック以外
2つ目の条件:マクロブック
3つ目の条件:更新モードで開いたブックが、何らかの事情で異常終了したため、残骸として残ったロックファイル
 
※注意事項
当該フォルダ内のマクロブックが、開いていると異常終了するかもしれません。
起動されるマクロの内容に依存します。
 

回答
投稿日時: 18/12/09 16:03:46
投稿者: WinArrow
投稿者のウェブサイトに移動

当該フォルダ内のマクロブックを、誰かが開いていたら
・・・という疑問がありますが、
前レスで紹介したコードは、この辺りを無視しています。
 
誰かが開いていたらr、エラーになることもあり得ます。
必要ならば、エラーにならないよう処理を追加してくださいね。

トピックに返信