質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

3624閲覧

VBA: Excelの複数シートをコピーして 名称をつけ保存

SatokoH

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/06/05 05:54

編集2021/06/05 07:28

Excel VBAについて教えてください。

3つのExcelシートのうち2シートをコピーして、
残りの 1シートに記載された部の数だけファイルを作成(ファイル名は部名称) 
コピーしたそれぞれのファイルの決められたセルには部名称を記載

<詳細>
Excelシートは、「一覧」 「1」 「部」 という3シートあり、「一覧」と「1」 という2シートをコピーして ファイル名は 「部」名称で保存。 
部別に作成された 「1」 というシートの C12 セルには部署名を入力

「部」のシートには、下記にように記載されております。

部署  部署名
QA MQA
QB MQB
QC MQC

下記VBA記載の場合、「1」 というシートのみコピーされ、保存できましたが、「一覧」シートも一緒に コピー保存をしたい為、その方法をご教示ください。

Sub シート作成()
Dim a
For a = 2 To Sheets("部").Range("B30").End(xlUp).Row

Sheets("1").Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = Sheets("部").Range("B" & a).Value

Sheets(Sheets.Count).Range("C12").Value = Sheets("部").Range("C" & a)
Sheets(Sheets.Count).Copy
Application.DisplayAlerts = False
Dim myDate As Variant
myDate = DateSerial(Range("M7"), Range("O7"), 1)

ActiveWorkbook.SaveAs "C:\Users\satoko.h" & ActiveSheet.Name & "" & Format(myDate, "yymm") & " " & "AAAA" & ".xlsx"
ActiveWorkbook.Close
Sheets(Sheets.Count).Delete
Sheets("1").Select

Next
End Sub

ーーーーーーーーーーー
ARRAY で SHEETS(ARRAY("一覧","1")).COPY
として作成しようとしましたが、思ったような結果になりませんでした。

 どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

今回のようにコピーしたりブックを閉じたりするとアクティブブックがその都度変わります。
Sheets("1") というようにブック名を付けないと、アクティブブックが対象になりますが、このようにアクティブブックが変化するような処理ではコードが読みづらくなりバグの元になります。

このような場合は、ブック名を省略せずに指定するようにしましょう。同じブックが繰り返し出現する場合は変数に代入しておいて、それを指定するといいでしょう。
あるいは、With 構文を利用するのもコードが読みやすくなります。

自分が書くなら下記のような感じにします。

vba

1Sub シート作成() 2 Dim myWB As Workbook: Set myWB = ThisWorkbook '自身のワークブック 3 4 With myWB.Sheets("1") 5 Dim myDate As String 6 myDate = Format(DateSerial(.Range("M7"), .Range("O7"), 1), "yymm") 7 End With 8 9 Application.DisplayAlerts = False 10 11 Dim a As Long 12 For a = 2 To myWB.Sheets("部").Range("B30").End(xlUp).Row 13 14 myWB.Sheets(Array("一覧", "1")).Copy '2シートを新規ブックにコピー 15 With ActiveWorkbook '新規ブック 16 Dim buName As String: buName = myWB.Sheets("部").Range("B" & a).Value 17 .Sheets("1").Range("C12").Value = myWB.Sheets("部").Range("C" & a) 18 .Sheets("1").Name = buName 19 ActiveWorkbook.SaveAs "C:\Users\satoko.h\" & buName & "_" & myDate & "_" & "AAAA" & ".xlsx" 20 ActiveWorkbook.Close 21 End With 22 Next 23 24 Application.DisplayAlerts = True 25 26End Sub 27

投稿2021/06/05 09:07

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatokoH

2021/06/05 10:39

ありがとうございます。With 構文や変数をうまく利用すれば、とても読みやすい構文になりますね。ブック名につきましても とても勉強になりました。
guest

0

ベストアンサー

こんな感じでどうでしょうか。

VBA

1Sub シート作成() 2 3 Dim a 4 5 Dim b As Worksheet, c As Sheets 6 With ThisWorkbook 7 Set b = .Worksheets("部") 8 Set c = .Worksheets(Array("1", "一覧")) 9 End With 10 11 Dim buName As String, newBook As Workbook, newSheet As Worksheet 12 13 For a = 2 To b.Range("B30").End(xlUp).Row 14 15 buName = b.Cells(a, 2).Value 16 c.Copy 17 Set newBook = ActiveWorkbook 18 Set newSheet = newBook.Worksheets("1") 19 20 With newSheet 21 .Name = buName 22 .Range("C12").Value = buName 23 End With 24 25 With newBook 26 .SaveAs buName 27 .Close False 28 End With 29 Next 30 31End Sub

投稿2021/06/05 09:03

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SatokoH

2021/06/05 10:40

ありがとうございます。シンプルでとても読みやすい構文ですね。おかげさまで解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問