【ExcelVBA】シートをコピーして挿入

Yahoo!知恵袋で答えた質問の中から、シートをコピーして挿入する方法を紹介します。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14271054724

エクセルマクロについて質問です。
AフォルダのA.xlsmの中のtestというシートをBフォルダの中にあるB.xlsm、C.xlsm、D.xlsmなどたくさんのファイルに挿入するマクロ文を作るにはどうすれば良いですか?教えていただけたら幸いです。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14271054724

Bフォルダの中に、B.xlsm、C.xlsm、D.xlsmがあるのでしょうか?質問文からははっきりそうだとは読み取れないのですが、多分そうだと仮定すると、次のようなコードになります。

回答

Pathは適宜修正してください。

Option Explicit

Public Sub SheetCopy2BookIn2()
    Dim Bk As Workbook
    Dim Sh As Worksheet
    Dim stBookName As String
    Dim stShortName As String
    
    Const cstAPath As String = "C:\temp\A\A.xlsm"
    Const cstSheet As String = "test"
    Const cstBPath As String = "C:\temp\B\"
    
    Set Bk = Workbooks.Open(Filename:=cstAPath, ReadOnly:=True)
    Set Sh = Bk.Worksheets(cstSheet)
    
    stBookName = Dir(cstBPath & "*.xlsm")
    
    Do While stBookName <> ""
        stShortName = Left(stBookName, 1)
        If stShortName = "B" Or stShortName = "C" Or stShortName = "D" Then
            With Workbooks.Open(Filename:=cstBPath & stBookName, ReadOnly:=False)
                Sh.Copy After:=.Worksheets(.Worksheets.Count)
                .Save
                .Close
            End With
        End If
        stBookName = Dir()
    Loop
    
    Bk.Close SaveChanges:=False
    Set Sh = Nothing
    Set Bk = Nothing
End Sub

解説

シートの挿入は、Copyメソッドを使います。Insertじゃないってところがミソですね。

Dir(cstBPath & “*.xlsm”)でフォルダの中にあるxlsmを検索しています。

次に現れるDir()は、引数がありませんが、引数が省略された場合は、先に指定したDir(cstBPath & “*.xlsm”)の引数が省略されたものと解釈されて実行されます。

Dirの戻り値はファイル名(短い方)です。もし検索してもヒットしなければ””(Null)が返されます。

Do While stBookName <> “”で、stBookName が””(Null)でない限り、ループします。

Workbooks.Openでは、必ずReadOnlyオプションをつけるようにしています。

できる限り読み取り専用(ReadOnly:=True)で開くようにし、どうしても上書きが必要な場合だけReadOnly:=Falseとしています。これは私のこだわりでして、ReadOnly:=Trueの方がほんのわずかですが処理速度が速いからです。しかし、3つのブックを開くだけの上記のコードでは、ほぼ意味がありません。