[[20230507100009]] 『ファイルのワークシートを削除し、さらにxlsmをxl』(たくぼく) ページの最後に飛ぶ

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

 

『ファイルのワークシートを削除し、さらにxlsmをxlsx形式で保存したい』(たくぼく)

『特定のシートを削除し、マクロブックをxlsxで保存したい』(たくぼく)
本件、VBAの作成依頼となります。
あるフォルダ配下にあるファイル(xlsm)の特定のワークシート(シート名A、シート名B)のみを削除して、さらにファイルをxlsxの拡張子に変更した状態で保存させたいです。
ファイルは数十程度あり、それぞれ違うネームで同一フォルダに入っております。
マクロ実行用のファイルにモジュールを作成し、そのファイルからボタン操作して処理を実行させたいイメージです。

具体的には下記のような流れです。

1. [特定のフォルダ配下]を巡回して[対象ファイル(xlsm)]を開く
 →(マクロ操作ブックの別シートに、対象ファイルの名前(A列)、ファイルパス(B列)を羅列し、そこを見て処理をさせたい

 2. ↑のブックのうち[特定のワークシート(シート名A、シート名B)]を削除する
 →ファイルの中にある「単体テスト」「日別集計」という名前の2つのシートのみを削除させたいです。
 3. 【xlsx形式】で保存する
 4. ↑を閉じる
 5. 2〜4を繰り返し

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 めちゃくちゃテキトーです
 ファイルがなかった場合などのエラー処理は省略してます。
 マクロ操作ブックの別シートのB列のファイルパスはフルネームであることが前提です。

 Sub test()
     Dim FSO As Object, i As Long, buf As String
     Set FSO = CreateObject("Scripting.FileSystemObject")
     Application.ScreenUpdating = False
     For i = 2 To Cells(Rows.Count, "B").End(xlUp).Row
         buf = FSO.GetBaseName(Cells(i, "B"))
         Workbooks.Open Cells(i, "B")
         With ActiveWorkbook
             Application.DisplayAlerts = False
             .Worksheets(Array("単体テスト", "日別集計")).Delete
             .SaveAs Filename:=buf & ".xlsx", FileFormat:=xlOpenXMLWorkbook
             .Close
         End With
     Next
     Application.ScreenUpdating = True
 End Sub
(フォーキー) 2023/05/07(日) 11:05:18

なんで別トピック立て直したんでしょうか?
↓で作成依頼であることを表明すれば済んだ話では?
[[20230502101207]] 『特定のシートを削除し、マクロブックをxlsxで保存』(たくぼく)

なお、作成依頼ということで興味はないかもしれませんがフォーキーさんの案だと「単体テスト」「日別集計」が存在しない場合エラーになっちゃうと思います。

(もこな2) 2023/05/07(日) 11:46:07


 私のコードで十分動くと思うんだけど・・・
(稲葉) 2023/05/08(月) 09:12:07

このトピックも放置する構えなのかトピ主からの反応ありませんが、いくつかコメントしておきます。

■1
>ファイルは数十程度あり、それぞれ違うネームで同一フォルダに入っております。
↑について「(マクロ操作ブックの別シートに、対象ファイルの名前(A列)、ファイルパス(B列)を羅列し、そこを見て処理をさせたい」とのことですが、そのリスト作りはどうするのでしょうか?
対象のファイルがあちこちのフォルダに散らばっているという理由でもなければ、前トピックのようにフォルダを巡回する案の方がよいように思います。

■2
こちらのトピックでコメントしたように、↓は対象のシートがないと失敗(実行エラーが発生)します。

 ActiveWorkbook.Worksheets(Array("単体テスト", "日別集計")).Delete

なので基本的には、前トピックの稲葉さん案のようにエラーをスキップするとよいと思いますが、対象のシートがある場合であっても【削除した結果(表示状態の)シートが0枚になってしまう場合】は削除に失敗します。

したがって、リストに応じて処理するというよりは、処理しながらリストを作成し処理結果を出力するという処理の方が安パイな気がします。

■3
>マクロ実行用のファイルにモジュールを作成し、そのファイルからボタン操作して処理を実行させたいイメージです。
その辺はすきにすればよいと思いますが、Excelの仕様上【同名ブック】は同時に開くことができませんので、リスト方式で行くにせよ、フォルダ巡回でいくにせよ、少なくとも【マクロ実行用のブック】と同名ブックがあったときの処理を考えておいたほうがよいとおもいます。

■4
ということを踏まえて、暇つぶしに書いてみました。

    Sub 研究用()
        Dim MyFile As Object
        Dim dstRNG As Range
        Dim tmpSH As Worksheet

        Set dstRNG = ThisWorkbook.Worksheets.Add.Range("A5")
        dstRNG.Parent.Range("A1:A2").Value = WorksheetFunction.Transpose(Array("対象フォルダ", "C:\あるフォルダ\"))
        dstRNG.Parent.Range("A4:C4").Value = Array("元ブック名", "単体テスト", "日別集計")

        Application.DisplayAlerts = False
        For Each MyFile In CreateObject("Scripting.FileSystemObject").GetFolder(dstRNG.Parent.Range("A2").Value).Files
            If MyFile.Type = "Microsoft Excel マクロ有効ワークシート" Then
                If ThisWorkbook.Name = MyFile.Name Then
                    dstRNG.Resize(, 3).Value = Array(MyFile.Name, "処理不能", "処理不能")
                Else
                    With Workbooks.Open(MyFile.Path)
                        dstRNG.Value = .Name

                        On Error Resume Next
                        Set tmpSH = Nothing
                        Set tmpSH = .Worksheets(dstRNG.Parent.Range("B4").Value)
                        If tmpSH Is Nothing Then
                            dstRNG.Offset(, 1).Value = "該当シート無し"
                        Else
                            tmpSH.Delete
                            dstRNG.Offset(, 1).Value = "削除" & IIf(Err.Number, "失敗", "成功")
                        End If
                        On Error GoTo 0

                        On Error Resume Next
                        Set tmpSH = Nothing
                        Set tmpSH = .Worksheets(dstRNG.Parent.Range("C4").Value)
                        If tmpSH Is Nothing Then
                            dstRNG.Offset(, 2).Value = "該当シート無し"
                        Else
                            tmpSH.Delete
                            dstRNG.Offset(, 2).Value = "削除" & IIf(Err.Number, "失敗", "成功")
                        End If
                        On Error GoTo 0

                        .SaveAs Filename:=.Path & "\【処理済】" & CreateObject("Scripting.FileSystemObject").GetBaseName(MyFile.Path), _
                                    FileFormat:=xlOpenXMLWorkbook

                        Set dstRNG = dstRNG.Offset(1)

                        .Close False
                    End With
                End If
            End If

        Next
        Application.DisplayAlerts = True
    End Sub

作成依頼ということなので、アプローチには興味皆無かもしれませんが提示しておきます。

■5
好みの部分だとは思いますが、保存するブック名に拡張子がついていない場合、保存形式に合わせてエクセル君が補完してくれますので指定しないというのも1つの手です。
(間違った拡張子を指定してしまうリスクも軽減できます)

踏まえて上記のうち、別名で保存する部分について

 .SaveAs Filename:=.Path & "\【処理済】" & CreateObject("Scripting.FileSystemObject").GetBaseName(MyFile.Path), _
         FileFormat:=xlOpenXMLWorkbook
                        ↓
 .SaveAs Filename:=Left(.FullName, InStrRev(.FullName, ".") - 1), FileFormat:=xlOpenXMLWorkbook

のようにするのもありかと思います。

(もこな2) 2023/05/08(月) 19:56:22


ここへ書き込んでいただいた皆様、放置するような形となってしまい申し訳ございません。別トピックを建てた意図としましては、追加で質問したい場合は新規トピックのほうが目が留まるかと思い作成してしまいました。

たくさんコードを作成いただきありがとうございます。恐れ入りますが、新たに追加コードの依頼をさせてください。
トピックの依頼内容に加えて、シート削除対象のファイルに対し、「補足」シートが存在した場合はそちらも削除する(存在しない場合はスルー)といったコードもお願いしたく存じます。
(たくぼく) 2023/05/10(水) 12:10:56


 結果のフィードバックもないし、要求増え続けそうなので、私は降りますね。
(稲葉) 2023/05/10(水) 12:20:09

指摘されても元スレを放置し続けてしかもこの
スレにty続けて書き込むってすごい強心臓ですね。
私は真似できない。
(とおりすがりんご) 2023/05/10(水) 12:25:09

>「補足」シートが存在した場合はそちらも削除する(存在しない場合はスルー)
既に(他のシートは)そういう動作になっているんですけどねぇ・・・

まぁ、ただ働きしてくれる人が現れず気が変わったら【自分でトライ】してみてから、"詰まっている部分を具体的に挙げて質問"してみてください。(それまではROMります)

(もこな2) 2023/05/10(水) 13:48:46


はい、承知しました。ご指摘ありがとうございます。
私の不手際により不快な思いをさせてしまった方、申し訳ございませんでした。
一度トライしてみて、またコメント書き込みさせていただきます。
(たくぼく) 2023/05/10(水) 15:54:54

遅くなりましたが、本日作成いただいたマクロを実行し、問題なく動いた旨ご報告させていただきます。
(もこな2) 2023/05/08(月) 19:56:22
もこな2様のマクロを参考に、「補足」シート削除の処理を追加して想定通りの動きとなることが確認できました。他、作成いただいた皆様のマクロについても今後のマクロ作成するにあたっての知識として参考といたします。
お忙しいところ、ご協力いただきました皆様誠にありがとうございました!
最後に別トピックを立ててしまうなど不手際があったり、スレッド放置してしまう形としてしまいました点につきましては改めてお詫び申し上げます。

(たくぼく) 2023/05/11(木) 11:12:46


■6
>「補足」シート削除の処理を追加して想定通りの動きとなることが確認できました。
同じ悩みをもってこのトピックにたどり着いた方向けに、最終的にどうなったのか提示(フィードバック)されてはどうですか。
(「2023/05/08(月) 19:56:22」に提示したものは、アプローチ説明用にあえて冗長にした部分もありますので、"そのまま"手を加えたのであれば、無駄が多いコードになっているとおもいます。)

■7
>作成いただいた皆様のマクロについても今後のマクロ作成するにあたっての知識として参考といたします。
参考としたならわかるとおもいますが、シートの削除部分の考え方は稲葉さんとおなじです。

■8
>最後に別トピックを立ててしまうなど不手際があったり、スレッド放置してしまう形としてしまいました点につきましては改めてお詫び申し上げます。
そうおもうのであれば、ご自身で↓の始末(このトピックへリンクを張る等)をされたらいかがですか?
[[20230502101207]] 『特定のシートを削除し、マクロブックをxlsxで保存』(たくぼく)

(もこな2) 2023/05/11(木) 12:52:35


コメント返信:

[ 一覧(最新更新順) ]


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