[[20220927165342]] 『ファイル保存時に同じ名前のファイルがあったとき』(SPQ) ページの最後に飛ぶ

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

 

『ファイル保存時に同じ名前のファイルがあったとき番号を付ける』(SPQ)

お世話になっております。

やりたいことはタイトルの通りですが、ファイル保存時に同じ名前のファイルがあったときAAA(2).xlsxのように番号を付けたいです。

保存先フォルダは
C:\Users\AAA\Desktop\BBB

保存形式はxlsx

保存するときの名前はsheet1のB2セルに入力されている数値を使用したいです。

よろしくお願いします。

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


 Dir関数を使い、同じファイル名が存在しなくなるまで
 ループでカウントアップしてファイル名を付けてはいかが
 でしょう?
(MK) 2022/09/27(火) 17:09

 Dir関数を使わずにFileSystemObject
 を使ってファイルの有無を判定する方法もあります
(MK) 2022/09/27(火) 17:12

 >Dir関数を使い、同じファイル名が存在しなくなるまでループでカウントアップ
 なるほど

 Sub sample()
   Const SavePath = "C:\Users\AAA\Desktop\BBB"
   Dim Filename As String
   Dim idx As Integer
   Filename = SavePath & Worksheets("Sheet1").Range("B2").Value & ".xlsx"
   Do While Dir(Filename) <> ""
      i = i + 1
      Filename = SavePath & Worksheets("Sheet1").Range("B2").Value & Format(i, "(0)") & ".xlsx"
   Loop
   ThisWorkbook.SaveCopyAs Filename:=Filename
 End Sub
(´・ω・`) 2022/09/27(火) 17:25

 横からおせっかい失礼します。

 Const SavePath = "C:\Users\AAA\Desktop\BBB"
 ↓
 Const SavePath = "C:\Users\AAA\Desktop\BBB\"

 Dim idx As Integer
 ↓
 Dim i As Integer

(MK) 2022/09/27(火) 17:31


 ですよね.... 失礼しました
(´・ω・`) 2022/09/27(火) 17:40

 FileSystemObject使ったら...

    Function NumberedFilename(Filename As String) As String
        Dim i As Long, p As String, b As String, e As String, fn As String
        With CreateObject("Scripting.FilesystemObject")
            p = .GetParentFolderName(Filename)
            b = .GetBaseName(Filename)
            e = .GetExtensionName(Filename)
            fn = .GetFileName(Filename)
            i = 1
            Do
                NumberedFilename = .BuildPath(p, fn)
                If Not .FileExists(NumberedFilename) Then Exit Do
                i = i + 1
                fn = b & Format$(i, "(0).") & e
            Loop
        End With
    End Function

(白茶) 2022/09/27(火) 17:58


ありがとうございます

Option Explicit

Sub 複数のシートを別ブックとして保存()

Dim new_file As String

new_file = Sheet1.Range("B2").Text

ThisWorkbook.Worksheets(Array("Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet8", "Sheet11")).Copy

Application.DisplayAlerts = False '確認メッセージの非表示
ActiveWorkbook.SaveAs Filename:="C:\Users\AAA\Desktop\CCC\" & new_file, CreateBackup:=False, FileFormat:=xlOpenXMLWorkbookMacroEnabled
ActiveWorkbook.Close

End Sub

複数のシートを別のブックに保存するマクロを色々検索してして作りました
これを(´・ω・`)さんの最初のマクロに組み込む場合どのような記述になるのでしょうか

(SPQ) 2022/09/28(水) 11:36


横からですがコメントします。

>これを(´・ω・`)さんの最初のマクロに組み込む場合どのような記述になるのでしょうか
そもそも、皆さんがアドバイスされた方法の仕組みを理解されているのでしょうか?
要は、ファイル名(フルパス)を組み立てたときに、そのファイルが無いという状況まで繰り返し処理で枝番号を加算しているだけですよね。

なので、たとえば↓のようにすればよいでしょう。

    Sub 整理()
        Dim ベース As String
        Dim 枝番号 As String
        Dim c As Long

        ベース = "C:\Users\AAA\Desktop\BBB\" & Sheet1.Range("B2").Text

        Stop 'ブレークポイントの代わり
        Do Until Dir(ベース & 枝番号 & ".xlsm") = ""
            c = c + 1
            枝番号 = "(" & c & ")"
             Stop 'ブレークポイントの代わり

        Loop

        Stop 'ブレークポイントの代わり
        Debug.Print ベース & 枝番号

        ThisWorkbook.Worksheets(Array("Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet8", "Sheet11")).Copy
        With Workbooks(Workbooks.Count)
            .SaveAs Filename:=ベース & 枝番号, FileFormat:=xlOpenXMLWorkbookMacroEnabled
            .Close
        End With

    End Sub

(もこな2) 2022/09/28(水) 12:40


もこな2さん

ありがとうございます

マクロを実行すると任意のシートが別ブックにまとまり、同じ名前があった場合、連番が付くようになりました。

作成されたブックを開くと以下のようなメッセージが出ます。

このブックには、安全ではない可能性のある外部ソースへのリンクが1つ以上含まれています。
リンクを信頼できる場合、リンクを更新して最新データを取り込みます。信頼できない場合は、データをそのまま手元で処理してかまいません。

元のブックにあったマクロも無くなってしまいました。
https://vbabeginner.net/how-to-create-a-personal-macro-book/
にあるように個人用マクロブックというものを作るしかないのでしょうか

(SPQ) 2022/09/28(水) 16:07


 マクロ有りブックをマクロ無しブック形式で
 保存したのではないですか?

 元ブックがxlsmだったらマクロ有りブックです。
 xlsxはマクロ無しブックです。

 また、マクロ有りブックで保存するときは、
 ファイル形式も指定してやる必要があります。
(MK) 2022/09/28(水) 16:20

 参考HPです。

https://www.sejuku.net/blog/67491
(MK) 2022/09/28(水) 16:27


 もこな2さんのコードのきちんと書かれてましたね。
 失礼いたしました。
(MK) 2022/09/28(水) 16:29

標準モジュールやWorkbookモジュールに
マクロを記述してあった、ということかな?
(MK) 2022/09/28(水) 16:33

 シートモジュール以外の箇所にマクロを記述してある
 場合は、ブックごとコピーしない限りマクロは引き継
 がれません。

 ブックを丸ごと複製して不要なシートを削除するか、
 お察しのとおり個人用マクロブックを使用する、あるいは
 アドイン化する、他のブックを制御するマクロ用ブックを
 作成する、などの方法があります。
(MK) 2022/09/28(水) 16:45

MKさん
たくさんコメントありがとうございます。

いつもALT+F11を押して、Microsoft Excel Objectsを右クリックして、挿入(N)、標準モジュール(M)でマクロを作っていました。

更新がかぶってしまったようです。すみません。

もこな2さん
MKさん
そうなんですか。知りませんでした。私の無知でもこな2さんに余計な手間をかけさせてしまいました。

ありがとうございました。
(SPQ) 2022/09/28(水) 16:53


書いている間に話が進んでおり、重複する部分もありますが投稿しておきます。

>元のブックにあったマクロも無くなってしまいました。
既に指摘があるように、コピーしているのは【シート】ですから、(対象の)シートモジュール以外に記述されているものはコピーされません。

そもそも論なのですが、マクロ付きブックである必要があるのですか?
「2022/09/28(水) 11:36」のコードで【FileFormat:=xlOpenXMLWorkbookMacroEnabled】となっていたのでそのままにしましたが、よくある勘違いとしてマクロ付きブックからコピーするので、必ずマクロ付きブックでコピーしなければならないと思い込んでいるケースがあります。

そうではなくて、どうしても、標準モジュールやWorkbookモジュールを保持したままで、コピーしたいというのであれば、発想を変えて

 1. 自ブックを【ファイル操作】でコピーする
 2. ↑の【ファイル名を変更する】
 3. ↑を自ブックとは【別のブック】として開く
 4. ↑の対象シート【以外を削除する】
 5. ↑を上書き保存して閉じる

というアプローチにしてみては如何でしょうか?

(もこな2) 2022/09/28(水) 17:45


失礼。よく考えたら↓でOKですね。
 1.ブックを複製する【SaveCopyAsメソッド】
 2.要らないシートを削除する【ループ処理】
 3.上書きして閉じる【Saveメソッドなど】

研究用に提示しておきます。

 完成品のプレゼントではありませんので、【ステップ実行】して研究のうえ
 必要な部分のみご自身のコードに組み込んでください。

    Sub 研究用さんぷる()
        Dim ベース As String, 枝番号 As String
        Dim c As Long
        Dim SH As Worksheet

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

        With ThisWorkbook
            '▼ファイル名決定の処理
            ベース = "C:\Users\AAA\Desktop\BBB\" & .Worksheets("Sheet1").Range("B2").Text
            Do Until Dir(ベース & 枝番号 & ".xlsm") = ""
                c = c + 1
                枝番号 = "(" & c & ")"
            Loop

            '▼丸ごと別ブックとして複製
            .SaveCopyAs ベース & 枝番号 & ".xlsm"
        End With

        '▼複製したブックを開いて、要らないシートを消した後上書き保存して閉じる
        With Workbooks.Open(ベース & 枝番号 & ".xlsm")
            Application.DisplayAlerts = False
            For Each SH In .Worksheets
                Select Case SH.Name
                    Case "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet8", "Sheet11"
                        '何もしない

                    Case Else
                        SH.Delete
                End Select
            Next SH
            Application.DisplayAlerts = True

            .Save '上書き保存
            .Close False
        End With
    End Sub

(もこな2) 2022/09/28(水) 18:26


コメント返信:

[ 一覧(最新更新順) ]


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