【ExcelVBA】シートをコピーして挿入
Yahoo!知恵袋で答えた質問の中から、シートをコピーして挿入する方法を紹介します。
質問
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14271054724
エクセルマクロについて質問です。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14271054724
AフォルダのA.xlsmの中のtestというシートをBフォルダの中にあるB.xlsm、C.xlsm、D.xlsmなどたくさんのファイルに挿入するマクロ文を作るにはどうすれば良いですか?教えていただけたら幸いです。
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つのブックを開くだけの上記のコードでは、ほぼ意味がありません。
-
前の記事
「僕は、そうは、思わない」【逆ソクラテス】 2022.12.06
-
次の記事
裁判所で傍聴していてつくづく思うこと 2022.12.08