[[20201213074856]] 『シート名を別ブックで指定フォルダへ保存したい』(さこ) ページの最後に飛ぶ

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

 

『シート名を別ブックで指定フォルダへ保存したい』(さこ)

マクロに詳しくない為、いろいろ調べて下記2つのモジュールを見つけました。
ただ、どちらもドキュメントに保存するモジュールの為
それを指定フォルダに保存するようにしたいです。

その際、1.2.3.4というシート名以外を保存するようにしたいです。
どのように修正したら良いでしょうか?

Sub SheetSave()
Dim i As Integer
Dim wb1 As Workbook
Dim SheetCnt As Integer
Set wb1 = ActiveWorkbook
SheetCnt = wb1.Sheets.Count
For i = 1 To SheetCnt
Workbooks.Add.SaveAs Filename:=wb1.Worksheets(i).Name &".xlsx"wb1.Worksheets(i).Copy before:=Workbooks(wb1.Worksheets(i).Name &".xlsx").
Worksheets(1)
Next i
End Sub

Sub シート分割()
Dim 対象シート As Worksheet
Dim ファイル名 As String
Dim パス名 As String

 ファイル名 = ThisWorkbook.Name
 ファイル名 = Left(ファイル名, Len(ファイル名) - 5)
 パス名 = ThisWorkbook.Path &"\"&ファイル名
If Dir(パス名, vbDirectory) = ""Then
 MkDir パス名
End If
 ChDir パス名
 Application.ScreenUpdating = False
For Each 対象シート In Worksheets
 対象シート.Copy
 ActiveWorkbook.SaveAs ActiveSheet.Name &".xlsx"Next
 Application.ScreenUpdating = True
 Application.Quit
 ThisWorkbook.Close False
End 

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


 マクロを置いたファイルの 1.2.3.4 以外のシートを新規ファイルにコピーで保存でしょうか。
 移動で保存でしょうか(元のファイルからは削除)。

 特定のフォルダは固定でしょうか?つど指定でしょうか。

 そのあたりで書き方が変わってきます。

 ところで 「1.2.3.4」は間がピリオドですけれど、そういう名前のシートですか?
 あるいは4つのシート(名前が「1」「2」「3」「4」)でしょうか?
(QS) 2020/12/13(日) 10:13

ご返信ありがとうございます。
諸々、説明不足で申し訳ありません。

1.2.3.4以外のシートをコピーで保存したいです。

特定のフォルダは都度指定です。
月ごとにフォルダ作成する為です。

シートはシート名が「1」、「2」、「3」、「4」の4シートあります。

何卒ご教授願います。
(さこ) 2020/12/13(日) 14:02


編集がかぶりましたがとりあえずそのまま。
>マクロに詳しくない為、いろいろ調べて下記2つのモジュールを見つけました。
細かい話ですが、「モジュール」ではなく「プロシージャ」ですね。(知らなくてもなんとでもなりますが)

提示されたコードは分からないなりにも自己検証してみましたか?
投稿時のミスかもしれませんが、必要な改行が抜けているのでどちらも構文エラーになりますよ。

ちなみに前者を整理・修正すると↓のようになります。

    Sub SheetSave_修正()
        Dim i As Integer
        Dim wb1 As Workbook

        With ActiveWorkbook
            For i = 1 To .Sheets.Count
                Workbooks.Add.SaveAs Filename:=.Worksheets(i).Name & ".xlsx"
                .Worksheets(i).Copy before:=Workbooks(.Worksheets(i).Name & ".xlsx").Worksheets(1)
            Next
        End With
    End Sub

こちらの場合、新規ブックを先に作ってから、そのブックシートの先頭に目的のシートをコピー挿入しているわけですが、新規ブックを作成したときのシートがそのままになっちゃいますがそれでよいのでしょうか?

また、後者は「Application.Quit」しているのが気になります。
(最終的に自ブックも閉じるので、想定どおりなのかもしれませんが・・・)

私なら↓のように保存した段階で閉じます。

    Sub シート分割()
        Dim 保存フォルダ As String
        Dim 対象シート As Worksheet

        With ThisWorkbook
            '▼拡張子を除いたフルパスを得る
            保存フォルダ = Left(.FullName, InStrRev(.FullName, ".") - 1)

            '▼保存用のフォルダが無ければ作成
            If Dir(保存フォルダ, vbDirectory) = "" Then MkDir 保存フォルダ

            For Each 対象シート In .Worksheets
                '▼対象シートを新規ブックにコピー
                対象シート.Copy

                '▼↑で作成された新規ブックを操作
                With Workbooks(Workbooks.Count)
                    .SaveAs 保存フォルダ & "\" & .Worksheets(1).Name
                    .Close
                End With
            Next
        End With
    End Sub

そして、質問については、対象のシート名などを確認して対象のものでなければ処理しないように条件分岐をすればよいですよね。

(もこな2 ) 2020/12/13(日) 14:40


追加で。

>どちらもドキュメントに保存する〜指定フォルダに保存するようにしたい
【前者の場合】

 〜.SaveAs Filename:=wb1.Worksheets(i).Name &".xlsx"

【後者の場合】

 ChDir  ThisWorkbook.Path &"\"& Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 5)
 〜.SaveAs ActiveSheet.Name &".xlsx"

となっていて、いずれも対象フォルダの指定を省略しているため、カレントフォルダに保存する命令になってます。
これは、省略せずに【フォルダも指定】するればよいだけです。
(方法は既に示しているとおりです)

>1.2.3.4というシート名以外を保存
>シートはシート名が「1」、「2」、「3」、「4」の4シートあります。
ということは、「1」、「2」、「3」、「4」というシートは保存されて「1.2.3.4」というシートが万が一あれば処理しない(保存しない)という理解でよいのですか?

(もこな2 ) 2020/12/13(日) 15:12


ご教授いただきましてありがとうございます。

細かい話ですが、「モジュール」ではなく「プロシージャ」 ですね。(知らなくてもなんとでもなりますが) →失礼いたしました。勉強になります。

提示されたコードは分からないなりにも自己検証してみまし たか? →検証はしたのですが、ドキュメントに保存されることしか理解できず、知識不足で申し訳ありません。

投稿時のミスかもしれませんが、必要な改行が抜けているの でどちらも構文エラーになりますよ。 →失礼いたしました。見つけたプロシージャをそのまま記載してしまいました。

 >Sub SheetSave_修正()
こちらの場合、新規ブックを先に作ってから、そのブックシ ートの先頭に目的のシートをコピー挿入しているわけです が、新規ブックを作成したときのシートがそのままになっち ゃいますがそれでよいのでしょうか? →sheet1というシートが残ることでしょうか?
残ったままでも問題ございません。

また、後者は「Application.Quit」しているのが気になりま す。 →知識不足で申し訳ありません。
 どういった影響があるのでしょうか?

以下、ご教授いただいたプロシージャの保存フォルダの部分に
フォルダのパス"\〜"のように置き換えればよいということでしょうか?シートも"1","2"〜というように置き換えればよろしいでしょうか?

理解不足で申し訳ありませんが
ご教授願います。

Sub シート分割()

        Dim 保存フォルダ As String
        Dim 対象シート As Worksheet

        With ThisWorkbook
            '▼拡張子を除いたフルパスを得る
            保存フォルダ = Left(.FullName, InStrRev(.FullName, ".") - 1)

            '▼保存用のフォルダが無ければ作成
            If Dir(保存フォルダ, vbDirectory) = "" Then MkDir 保存フォルダ

            For Each 対象シート In .Worksheets
                '▼対象シートを新規ブックにコピー
                対象シート.Copy

                '▼↑で作成された新規ブックを操作
                With Workbooks(Workbooks.Count)
                    .SaveAs 保存フォルダ & "\" & .Worksheets(1).Name
                    .Close
                End With
            Next
        End With
    End Sub
(さこ) 2020/12/13(日) 16:33

続けて失礼いたします。

>1.2.3.4というシート名以外を保存
>シートはシート名が「1」、「2」、「3」、「4」の4シートあります。
ということは、「1」、「2」、「3」、「4」というシートは保存されて「1.2.3.4」というシートが万が一あれば処理しない(保存しない)という理解でよいのですか?
→はい、おっしゃる通りです。
 ですので、除外したいシートを指定したいのです。
 
(さこ) 2020/12/13(日) 16:36


>見つけたプロシージャをそのまま記載してしまいました。
>検証はした

検証できたのであれば気づいてますよね?

 Workbooks.Add.SaveAs Filename:=wb1.Worksheets(i).Name &".xlsx"wb1.Worksheets(i).Copy before:=Workbooks(wb1.Worksheets(i).Name &".xlsx").
 Worksheets(1)
    ↓
 Workbooks.Add.SaveAs Filename:=wb1.Worksheets(i).Name &".xlsx"
 wb1.Worksheets(i).Copy before:=Workbooks(wb1.Worksheets(i).Name &".xlsx").Worksheets(1)

 For Each 対象シート In Worksheets
  対象シート.Copy
  ActiveWorkbook.SaveAs ActiveSheet.Name &".xlsx"Next
    ↓
 For Each 対象シート In Worksheets
  対象シート.Copy
  ActiveWorkbook.SaveAs ActiveSheet.Name &".xlsx"
 Next

>>「1.2.3.4」というシートが万が一あれば処理しない(保存しない)
>→はい、おっしゃる通りです。
ということはこう考えればよいですね。

    Sub シート分割()
        Dim 保存フォルダ As String
        Dim 対象シート As Worksheet
        With ThisWorkbook
            保存フォルダ = Left(.FullName, InStrRev(.FullName, ".") - 1)
            If Dir(保存フォルダ, vbDirectory) = "" Then MkDir 保存フォルダ

            For Each 対象シート In .Worksheets

                '▼▼▼対象シートの【名前】が「1.2.3.4」以外のときにこの処理をする▼▼▼
                対象シート.Copy

                With Workbooks(Workbooks.Count)
                    .SaveAs 保存フォルダ & "\" & .Worksheets(1).Name
                    .Close
                End With
                '▲▲▲対象シートの【名前】が「1.2.3.4」以外のときにこの処理をする▲▲▲
            Next

        End With
    End Sub

↑で少し考えてみて下さい。

 ヒント:対象シート.Name でシート名を調べることができます。

(もこな2) 2020/12/15(火) 19:14


もこな2さま
先日はご教授頂きましてありがとうございました。
ただ、いろいろ調べたり、考えてみたのですがわかりませんでした。
申し訳ありません。
(さこ) 2020/12/18(金) 10:51

落ち着いて考えれば理解できるとおもいますが、以下をステップ実行して、どのように実行されるか、また、変数がどのように変わっていくのか確認してみてください。
    Sub シート分割()
        Dim 保存フォルダ As String
        Dim 対象シート As Worksheet

        Stop ' ブレークポイントの代わり

        With ThisWorkbook
            保存フォルダ = Left(.FullName, InStrRev(.FullName, ".") - 1)
            If Dir(保存フォルダ, vbDirectory) = "" Then MkDir 保存フォルダ
            For Each 対象シート In .Worksheets

                If 対象シート.Name <> "1.2.3.4" Then '★もしも、対象シートの【名前】が「1.2.3.4」以外のときは以下の処理をする
                    対象シート.Copy
                    With Workbooks(Workbooks.Count)
                        .SaveAs 保存フォルダ & "\" & .Worksheets(1).Name
                        .Close
                    End With
                End If '★もしもの話はおしまい

            Next
        End With
    End Sub

(もこな2 ) 2020/12/20(日) 18:30


コメント返信:

[ 一覧(最新更新順) ]


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