[[20220603233923]] 『複数シートを複数ブックに保存』(みず) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数シートを複数ブックに保存』(みず)

お世話になります。
ブック内に複数のシートがあり
それぞれのシートを
それぞれ別ブックに保存したいのです。
細かく言うと

シート名
・一覧
・A
・B
・C
と4つのシートがあるとします。
ブックは3つに分ける。
シートの組み合わせは
1,一覧 & A
2,一覧 & B
3,一覧 & C の
3つのブックを作りたいのです。

ネットから引用した
Sub TEST2()

    Dim A

    'シートをすべてループ
    For Each A In Worksheets
        '新規ブックにコピー
        A.Copy
        '名前を付けて保存
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & A.Name & ".xlsx"
        ActiveWorkbook.Close False 'ブックを閉じる
    Next

End Sub

を元に

Array("一覧",a).Copy としてみたり
使い方を分かっていないので上手くいきません。

For Each __ In Worksheets
以外の方法でないと
解決策ないのでしょうか?

どなたかご教授よろしくお願い致します。

< 使用 Excel:Office365、使用 OS:Windows10 >



 >Array("一覧",a).Copy としてみたり
 >使い方を分かっていないので上手くいきません。

 それは、困りましたね。
 ↓このへんを閲覧すると良いかもですね。
 完全に理解するまで行かないでも良いので、なんとなくサラッとわかれば良 
 いかと思います。

 シートを別ブックとして保存する
http://officetanaka.net/excel/vba/tips/tips170.htm
Office TANAKA 田中 亮

 読んだら…まずは、下記( Sample1 )を実行してみましょう。

 Sub Sample1()
    Sheets(Array("一覧", "A")).Copy
 End Sub

 どうなりましたか?…できましたね。
 一覧シートと、AシートのみをコピーしたBOOKが^^

 でも、これだと手動でBOOK名を変更したり、大量に
 BOOKを作るとなるとやってられないです。(笑)

 では、元BOOKを、Master.xlsm とした場合
 その分身( 3つに分けるブック )複数BOOKを作成するとなると、その保存先は
 どうなるでしょうか?

 当然、…Master( BOOK )と同じフォルダー内に収納したくなりませんか?
 では、フォルダー内に、元BOOK( Master.xlsm )を入れて下記の( Sample2 )を
 実行するとどうなりますでしょうか?

 Sub Sample2()

    Dim NewBookName As Variant
    Dim i As Long
    NewBookName = Array("A", "B", "C")
    For i = 0 To UBound(NewBookName)
      Select Case i
        Case 0
            ThisWorkbook.Worksheets(Array("一覧", "A")).Copy
            ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path _
            & "\一覧" & "&" & NewBookName(i) & ".xlsx"
            ActiveWorkbook.Close False
        Case 1
            ThisWorkbook.Worksheets(Array("一覧", "B")).Copy
            ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path _
            & "\一覧" & "&" & NewBookName(i) & ".xlsx"
            ActiveWorkbook.Close False
        Case 2
            ThisWorkbook.Worksheets(Array("一覧", "C")).Copy
            ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path _
            & "\一覧" & "&" & NewBookName(i) & ".xlsx"
            ActiveWorkbook.Close False
        End Select
    Next

 End Sub

 意味合いは上記なんだけども…ちょっとコード長いから...変更^^;

 Sub Sample3()
    Dim SheetName As Variant
    Dim i As Long
    SheetName = Array("A", "B", "C")
    For i = 0 To UBound(SheetName)
        ThisWorkbook.Worksheets(Array("一覧", SheetName(i))).Copy
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path _
        & "\一覧" & "&" & SheetName(i) & ".xlsx"
        ActiveWorkbook.Close False
    Next
 End Sub

 ※やりたいことと違った場合は、他の回答者をお待ちください。

(あみな) 2022/06/04(土) 07:08


ちゃんと考えたら、ちゃんと言語化できてない部分があることに気づけますか?

Sub test04()

    Dim ws As Worksheet
    Dim sPath As String
    Dim sName As String
    Const sKey As String = "XXXX"
    Const sKey2 As String = "一覧"

    sPath = ThisWorkbook.Path & "\" & sKey & ".xlsx"
    For Each ws In ThisWorkbook.Worksheets
        sName = ws.Name
        If sName <> sKey2 Then
            Worksheets(Array(sKey2, sName)).Copy
            Workbooks(Workbooks.Count).Close SaveChanges:=True, Filename:=Replace(sPath, sKey, sName)
        End If
    Next
End Sub
(まっつわん) 2022/06/04(土) 09:03

既に皆さんからアドバイスをいただいているので解決してるかもですがコメントしておきます。

■1
>Array("一覧",a).Copy としてみたり
発想というか着眼点はわるくないです。

一覧シートとAシートを新規ブックにコピーする操作を【マクロの記録】でコード化してみるとおそらく↓のようなコードが記録されるかとおもいます。

 Sheets(Array("一覧", "A")).Copy

これは

 Sheets                (                   Array("一覧", "A")           )      .Copy
 シートの集まり   のなかから    「一覧」と「A」という名前のシート      を     コピーしなさい  新規ブックへ

という意味になります。
つまり、「Array("一覧",a).Copy」がなぜ失敗したかというと【シートの集まり】というのを指定しなかったためです。

■2
>For Each __ In Worksheets 以外の方法でないと解決策ないのでしょうか?
いえ、そんなことはないです。

既にあみなさんからも提示がありますが、組み合わせごとに【新規ブックへコピー】&【新規ブックを名前を付けて保存してから閉じる】というのを3回やればよいです。

たとえば、こんな感じです。

    Sub 研究用01()
        ThisWorkbook.Worksheets(Array("一覧", "A")).Copy
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\A"
        ActiveWorkbook.Close False

        ThisWorkbook.Worksheets(Array("一覧", "B")).Copy
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\B"
        ActiveWorkbook.Close False

        ThisWorkbook.Worksheets(Array("一覧", "C")).Copy
        ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\C"
        ActiveWorkbook.Close False
    End Sub

■3
上記をみればわかるとおもいますが、一覧シートの相方になる【シート名】(と保存するときの名前)だけが変わってますよね。
ということは、シート名を入れ替えながら繰り返し処理をすれば、3回分をいちいち書かなくても済みそうですね。

たとえば、こんな感じです。

    Sub 研究用02()
        Dim シート名 As Variant

        For Each シート名 In Array("A", "B", "C")
            ThisWorkbook.Worksheets(Array("一覧", シート名)).Copy
            ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & シート名
            ActiveWorkbook.Close False
        Next
    End Sub

■4
「For Each __ In Worksheets」と表現された命令は、「For Each 〜 Nextステートメント」と呼ばれるものですが、集まりの中から1つずつ取り出して繰り返し処理を行うものです。
しがたって"In Worksheets"としているから、シートの集まりである(自ブックの)シートコレクションから1シートずつ取り出して処理していたわけです。

このように、集まりから1つずつ取り出しながら繰り返す命令ですから、使えるのはWorksheetsコレクションに限った話ではありません。ブックの集まりやセルの集まりなんかも対象ですし、データの集まりである【配列】も対象になります。

なので、「■3」では、"A", "B", "C"という文字列の集まりを作っておき、そこから1つずつ取り出させているわけです。
ただ、1点注意が必要なのが、For Each 〜 Nextステートメントに【配列】から取り出す場合、受け手はVariant型である必要があります。
"文字列"の集まりなんだからString型じゃないの?とおもうかもしれませんが、そういう仕様ですから我慢してください。
↓のようにしていたのは、そういう理由があってのことです。

 Dim シート名 As Variant

(もこな2) 2022/06/04(土) 10:31


あみな様、もこな2様
貴重お時間を頂きありがとうございました。
順を追った説明と分かり易い説明で
理解する事が出来ました。

>For Each 〜 Nextステートメント」・・・集まりの中から1つずつ取り出して繰り返し処理を行う
集まりの定義がわかっていませんでした。

>For Each シート名 In Array("A", "B", "C")
("A", "B", "C")の部分のシート名は、特定でなく名前が変わって増えたりしますので

For Each 対象シート In Worksheets
Sheets(Array("一覧", シート名)).Copy を使わせて貰いました。

この時なかなかうまく動かなくて
色々悩んで
>シートの集まり
という点をもう一度よく考え、シート名として認識させるにはと色々試して
Sheets(Array("一覧", シート名.Name)).Copyにたどり着きました。

まだ未完成なのでプログラムの続きを作って頑張って完成させます。

>For Each 〜 Nextステートメントに【配列】から取り出す場合、受け手はVariant型である必要があります。
別シートのリストを【配列】と使いたいと考えていますので
注意点を覚えて置きます。

勉強になりました。
ありがとうございました。

(みず) 2022/06/05(日) 23:52


■5
>For Each 対象シート In Worksheets
>Sheets(Array("一覧", シート名)).Copy を使わせて貰いました。
>この時なかなかうまく動かなくて〜
>Sheets(Array("一覧", シート名.Name)).Copyにたどり着きました。

そういうことなら、完成形は↓のような感じになるとおもいます。

 ※「一覧」シート以外を「一覧」シートと組み合わせてコピーしたあと、組み合わせたシート名で保存

    Sub 研究用03()
        Dim SH As Worksheet

        For Each SH In ThisWorkbook.Worksheets
            If SH.Name <> "一覧" Then
                ThisWorkbook.Worksheets(Array("一覧", SH.Name)).Copy
                With Workbooks(Workbooks.Count)
                    .SaveAs Filename:=ThisWorkbook.Path & "\" & SH.Name
                    .Close False
                End With
            End If
        Next
    End Sub

(もこな2 ) 2022/06/06(月) 19:05


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.