ファビコン。井の家紋。別ファイルへシートコピー後、シート名変更をして保存する | エクセルマクロ(VBA)実践蔵(じっせんぐら)

前の項目 - マクロで表やグラフを書くためのコツ
次の項目 - 自作のカレンダーフォームを作ろう

別ファイルへシートコピー後、シート名変更をして保存する最終更新日:2019-06-18

このページに記載しているマクロは、1シートを別ブックへシート名を変更してコピーして保存するマクロになります。

複数シートをシート名変更せずに別ブックへまとめて保存するマクロを記述しているページもありますので、以下は参考までに。

テンプレートを活用する場合に必ず必要となる処理が、別ファイルへのシートの複製とシート名のリネーム処理になります。マクロ有効ファイル(xlsm)にあるシートを標準エクセルファイル(.xlsx)へコピーし、シート名をリネームすることを考えます。よく使用するマクロは準備しておくと、いつでも使いまわせます。

入力データ同様、出力ファイル先の指定でも、ファイル参照、又は、フォルダ参照を使用した方が汎用性が高くなります。

ここではテンプレートシートを複製する前提のため、コピー元シートを(シート名「temp」)に限定しています。

シートを複製する場合、新規エクセルファイル 又は 既存エクセルファイル に対して、シートを複製することになると思います。

新規エクセルファイルの場合は、格納先フォルダを「フォルダ参照」で指定し、ファイル名をセルから指定できるようにします。

既存エクセルファイルの場合は、「ファイル参照」を使用し、既存のエクセルファイルを選択できるようにします。

エクセルExcelマクロVBA 既存ファイル又は新規ブックへのシート追加

C列17行目をクリックすると、下記のように入力規則のリストにしています。

エクセルExcelマクロVBA 既存ファイル又は新規ブック選択リスト拡大図

セルの入力規則を設定するダイアログ

エクセルExcelマクロVBA 既存ファイル又は新規ブックを選択させる入力規則リストのダイアログ

入力規則のリストによって選択肢を限定することで、異常値が設定されることへの考慮を行う必要はなくなります。

テンプレートシートを複製した後のシート名は、マクロを実行する日の日付(月2桁と日2桁の4桁)にしています。上の図の"F列19行目"のセルは、手入力ではなく、エクセルの標準関数 「=TODAY()」をセルに記入してあります。そして、セルの書式設定でユーザー設定(mmdd)を設定しておくと、図のように4桁で表示されます。これをマクロ側で取得するには、「Range("F19").Text」にて取得できます。「.Value」ではなく「.Text」で取得することがポイントです。セルの書式設定をマクロ側にも引き継げます。

シート側の処理

既存ファイル指定ボタンに登録するマクロについては、ファイル参照 - ファイル選択ダイアログを、新規ブックを作成する場合のフォルダ参照ボタンに登録するマクロについては、フォルダ参照 - フォルダ選択ダイアログを参照してください。

 
'**********************************
' 実行ボタンに登録されているマクロ
'**********************************
Sub 実行_Click()

'変数宣言(オブジェクト)
Dim outBook As Workbook
Dim copySheet As Worksheet

'変数宣言(文字列)
Dim FilePathName As String, newSheetName As String
Dim PathName As String, filename As String

' ---------------------------
'セルからの入力データ
' - 既存ブックに追加する場合用
FilePathName = Range("B6").Text

' - 新規ブックに追加する場合用
PathName = Range("B10").Text
filename = Range("D12").Text

' - 共通
newSheetName = Range("F19").Text
' ---------------------------

'------画面更新OFF------------------
Application.ScreenUpdating = False
'------------------------------------

If StrComp(Range("C17").Value, "既存エクセルファイル") = 0 Then

'既存ファイルを開く
Set outBook = OpenBook(FilePathName)

Else

'新規ブックを作成して、名前を付けて保存
Set outBook = OpenNewBook(PathName & "\" & filename)

End If

If Not outBook Is Nothing Then

'ブックへ"temp"シートを複製し、作成されたオブジェクトをもらう
Set copySheet = CopySheet_BooktoBook(ThisWorkbook, "temp", outbook, newSheetName)

'****************************
'* 新規シートへデータを入力 *
'****************************

'オブジェクトは使い終わったらメモリを解放
Set copySheet = Nothing

'上書き保存して、閉じる(ブックオブジェクトのメモリ解放)
Call SaveAndCloseBook(outBook)

End If

'------画面更新ON------------------
Application.ScreenUpdating = True
'------------------------------------

End Sub

上記で呼び出しているOpenBookOpenNewBookCopySheet_BooktoBookSaveAndCloseBookは、標準モジュールに記載していきます。

Application.ScreenUpdating にFalseを設定すると、エクセルの既存ファイルや新規ファイルを開いたり閉じたりする動作が画面上、表示されなくなります。使用する場合は、必ずマクロ終了前にTrueに戻します。動作を確認したい場合は、デフォルトのTrueのまま動作させてください。処理量が多いマクロを実行する際には、画面更新をOFFにすることで処理速度は向上します。

標準モジュール側の処理

 
'***************************
' エクセルファイルを開く
'***************************
Function OpenBook(ByVal FilePath As String) As Workbook

On Error Resume Next

Set OpenBook = Workbooks.Open(FilePath)

'エラーが発生した事を確認する
If Err.Number <> 0 Then
MsgBox ("エクセルファイルを開けませんでした。")
Set OpenBook = Nothing
End If

End Function

エラー処理を念のため、入れていますが、ファイルを参照後に、ユーザがファイルを削除しない限りは、エラールートには入りません。

 
'****************************************************************
' 新規ファイルを作成して開く。空の状態で一度保存。
' 同一ファイル名が既に存在する場合、
' ①前のファイルを破棄して新規作成したものを置き換えるか、(SaveAs関数内動作)
' ②既存ファイルを開きなおすか、③処理をキャンセルするか選択できます。
'
' 新規作成して保存したWorkbookオブジェクト 又は
' 既存の同一ファイル名を開きなおしたWorkbookオブジェクトを返す
'****************************************************************
Function OpenNewBook(ByVal SaveFilePath As String) As Workbook

Dim newBook As Workbook
Dim kekka As VbMsgBoxResult

'新規ファイルを開く
Set newBook = Workbooks.Add '新規ワークブックを作成


On Error Resume Next

'新規ブックの保存
newBook.SaveAs SaveFilePath

If Err.Number <> 0 Then

'保存しないで閉じる
newBook.Close SaveChanges:=False

kekka = MsgBox("既存ファイルに追加しますか?", vbYesNo + vbQuestion)

If kekka = vbYes Then

'既存ブック優先が選択された場合、既存ブックを開く
Set newBook = OpenBook(SaveFilePath)
Else

'処理終了
MsgBox "ファイル名を変更して、再実行してください。"

Set newBook = Nothing

End If
End If

'Workbookオブジェクトを返す
Set OpenNewBook = newBook

End Function

新規ブックを開き、名前を付けて保存する際に、既に同じファイル名が同じフォルダ上に存在する場合、置き換えるか、置き換えを行わないかの選択ダイアログが表示されます。これは、マクロで制御しているものではなく、エクセルのExcelBook ObjectのSaveAs関数の中に組み込まれています。このとき、「はい」を選択した場合は、エラーにはならず、正常(同じファイル名が同じフォルダ上に存在しないとき)と同様の扱いになります。

上記ダイアログで「いいえ」(置き換えない)を選択した場合は、SaveAs関数からエラーが通知されます。置き換えない場合が選択された時の上記マクロでの処理は、

というコードになります。

続いては、シート側の「実行ボタン」クリック時のイベント関数から呼び出されている、エクセルシートをコピーする関数の処理になります。

 
'**********************************************************************
' エクセルシートの複製処理
' (コピー元シート:inWorkbook、コピー先:outWorkbook)
'
' 第一引数(inWorkbook)ファイル内の第二引数(copySheet)シート名を
' 第三引数(outWorkbook)の先頭へ複製
' 第四引数(outSheetname)はオプションでコピー後のシート名。
' 戻り値:複製されたシートオブジェクト
'**********************************************************************
Function CopySheet_BooktoBook(ByVal inWorkbook As Workbook, _
ByVal copySheet As String, _
ByVal outWorkbook As Workbook, _
Optional ByVal outSheetName As String = "") As Worksheet

Dim searchSheet As Worksheet
Dim result As Boolean

If Not inWorkbook Is Nothing And Not outWorkbook Is Nothing Then

If Not inWorkbook.Worksheets(copySheet) Is Nothing Then

'シートを複製
inWorkbook.Worksheets(copySheet).Copy Before:=outWorkbook.Sheets(1)

If Not outSheetName = "" Then
'オプションでリネーム指示あり

'同一シート名が存在するか確認
result = IsSameSheetName(outWorkbook, outSheetName)

If result = False Then
'変更したいシート名と同一シート名がない場合、リネームする

'複製シートに指定の名前を付ける
outWorkbook.ActiveSheet.Name = outSheetName
Else

End If
End If
'複製されたシートオブジェクトを返す
Set CopySheet_BooktoBook = outWorkbook.ActiveSheet

End If

End If

'メモリ解放
Set searchSheet = Nothing

End Function

 
'**********************************************************************
' エクセルブック内に同一シート名が存在するかを返す
' 第一引数:エクセルブック(Workbook)、第二引数:シート名(String)
' 戻り値:TRUE(同一シート名あり)
' FALSE(同一シート名なし)
'**********************************************************************
Function IsSameSheetName(book As Workbook, chkSheetName As String) As Boolean

Dim targetSheet As Worksheet

'戻り値を同一シート名なしで初期化
IsSameSheetName = False

'引数のブック内のシート数分確認
For Each targetSheet In book.Worksheets

If Not chkSheetName = "" Then

'シート名を比較
If StrComp(chkSheetName, targetSheet.Name, vbTextCompare) = 0 Then

'同一シート名ありを設定
IsSameSheetName = True
Exit For

End If
Else
'チェックなし
Exit For
End If
Next

'メモリの解放
Set targetSheet = Nothing

End Function

コピー後にオプション引数で指定された「シート名」と同一シート名が既に存在する場合は、シートコピー関数がコピーしたときの初期シート名のままとなります。

上記関数の後に、シート側の「実行ボタン」クリック時のイベント関数に戻り、下記の関数が呼び出され、更新したエクセルファイルを保存して閉じます。

 
'************************************
' エクセルブックを上書きして、閉じる
'************************************
Function SaveAndCloseBook(ByRef objWorkbook As Workbook)

'ブックを上書き保存
objWorkbook.Save

'ブックを閉じる
objWorkbook.Close

'メモリ解放
Set objWorkbook = Nothing

End Function

用済みとなったメモリを忘れずに解放しておきます。

エクセルVBAでは、Object型(構造体)を操作するときには、「Set 変数名 = Object名 」にて、設定し、使用が終わったら、Nothing を設定して、メモリを解放します。

引数がByRefの場合は、呼び出し側と同一のメモリ領域を使用します。ByValの場合は、関数内限定のメモリ領域が使用され、関数終了時に自動解放となります。

ここでは、呼び出し側のメモリを解放するために、ByRefとしています。

別ファイルへシート複製するエクセルマクロ有効ブックのダウンロード

ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。

マクロの有効化手順については、こちらも参考にしてください。

別ファイルへシート複製するエクセルファイル(xlsm)のダウンロード

ポイント ☆ point ☆

既存ファイルへのシート追加と新規ファイルへのシート追加の処理を共通化していくために、新規ファイルを作成後、すぐに名前を付けて保存することで、以降の処理が既存ファイルへのシート追加と共通化することができました。但し、欠点としては、途中でエラーが発生した場合は、空ファイルが残ります。今回は、再度実行する前提で記述しています。

前の項目 - マクロで表やグラフを書くためのコツ
次の項目 - 自作のカレンダーフォームを作ろう

2025/03/31 11:22 ExcelCalendar:こんにちは。対応ありがとうございます。丁寧な解説もありがとうございます。
2025/03/28 19:48 ExcelCalendar:【管理人】勉強中ということだったので、六曜追加対応の解説も追記しました。
2025/03/28 15:00 ExcelCalendar:【管理人】連絡ありがとうございます。段数が少ない月の調整を3段に対応するように修正しました。
2025/03/28 13:17 ExcelCalendar:こんにちは。六曜の件で質問があります。2025年1月でマクロを実行すると一行挿入されています。六曜の終わりも31日で終わらない月もあります。確認の程、宜しくお願い致します。
2025/03/26 10:26 ExcelCalendar:六曜の対応、ありがとうございます。勉強を始めたばかりで分からない点が多いですが、こちらのサイト見てマクロに強くなりたいと思います。今後とも宜しくお願い致します。
2025/03/25 11:32 ExcelCalendar:【管理人】エクセルでカレンダーを作成するマクロに六曜対応を追加しました。ダウンロードは六曜非対応版と2つに分けています。
2025/03/25 09:49 ExcelCalendar:【管理人】そうですね。六曜はwebAPIからなら取得できそうなので、処理時間は増えそうですが、考えてみます。
2025/03/24 13:25 ExcelCalendar:こちらを使用しております。六曜の対応をしたいのですが分かりません。テンプレートはございますか?
2025/03/18 18:48 MailDelete:【管理人】前回更新のOutlook迷惑メール削除マクロのバグ対応による更新。および、注意事項を追記しました。
2025/03/14 12:15 MailDelete:【管理人】Outlook迷惑メール削除マクロを更新しました。ホワイトリストチェックの追加と処理の軽量化、および、空メールの削除を追加。
2025/03/12 16:21 GetJPNHoliday:【管理人】2026年までの春分の日・秋分の日は、更新前のものでも対応できていることを確認したため、他のページはそのままにします。
2025/03/12 16:18 GetJPNHoliday:【管理人】国民の祝日を取得するエクセルマクロ。2050年までの春分の日秋分の日の暫定日が国立天文台のHPに記載があったため、このページのみ更新しました。
2025/03/11 11:54 MakeFolderAndStore:【管理人】ダウンロードファイル内のみ同じマクロを含むため、こちらも更新しました。#Windows日付表示形式変更対応
2025/03/11 11:52 GetFileMadeDate:【管理人】画像の撮影日取得マクロのWindows日付表示形式変更対応。更新しました。
2025/03/11 11:23 MakeFolderAndStore:【管理人】なるほど。Windowsの設定で表示形式が変更可能なのですね。対処しておきます。連絡ありがとうございます。
2025/03/10 22:05 HowToResolutionERROR:こちらの環境で、https://dekiru.net/article/23658/ これをやったからですね。windowsは表示日付のフォーマット変更が出来るので、その影響を受けたためかと。
2025/03/10 22:01 HowToResolutionERROR:replaceでは2が空文字に置き換わっているため、「"5/03/09(日)"」になっています
2025/03/10 22:01 HowToResolutionERROR:topString = Mid(dateString, 1, 1)では2が取得されており、
2025/03/10 22:01 HowToResolutionERROR:日時変換(dateString As String) の段階で"25/03/09(日) 21:36"になり、
2025/03/10 14:30 MakeFolderAndStore:【管理人】撮影日に曜日の日本語が入るケースがこちらの環境では確認できませんでした。再現できない事象に関しては対処が難しいです。Win11やWin10で書き換えをした場合、曜日は入らないです。
2025/03/10 12:57 AllFile-Trimming:【管理人】画像まとめて一括トリミングに高解像度画像の保存版を追加しました。半自動程度と思ってください。正しく対応するならPublisherを使用する必要がありそうです。
2025/03/09 21:48 MakeFolderAndStore:If IsDate(日時変換(dateString)) = True Then ここが日付判定されずに落ちますね。日時変換の中身が「"5/03/09(日)"」になっています。
2025/03/07 14:41 AllFile-Trimming:【管理人】バグ対応 画像まとめて一括トリミング 拡張子の大文字対応に不備があったので、上げなおしました。申し訳ありません。(v3r1)
2025/03/07 14:38 AllFile-Trimming:【管理人】ユーザ操作の模倣で、「図の保存」操作をVBにさせることでできるか試してみます
2025/03/07 14:37 AllFile-Trimming:【管理人】書き込みありがとうございます。確かに今の保存方法だと96dpiですね。VBからの画像ファイル書き出し命令では、解像度維持が難しそう。
2025/03/04 13:59 AllFile-Trimming:オプション「ファイル内のイメージを圧縮しない」にチェックを入れたりしてみたのですが変わりませんでした。もしご存じでしたら圧縮されない方法をご教示いただけますと幸いです。
2025/03/04 13:58 AllFile-Trimming:一括トリミングを使用させていただいたのですが、保存前(300dpi)後(96dpi)で解像度が変わってしまいます。
2025/02/28 12:40 AddPictWord:【管理人】新規記事 「Wordへの画像貼り付けマクロ(Wordマクロ)」を追加しました。
2025/02/28 12:39 AllFile-Trimming:【管理人】画像まとめて一括トリミングを更新。拡張子が大文字の場合に対応しました
2024/12/26 09:45 MakeFolderAndStore:【管理人】同じくファイルを年月別のフォルダに振り分けを行うマクロの撮影日取得箇所に同じ修正処置を入れています。
2024/12/26 09:43 GetFileMadeDate:【管理人】画像ファイルや動画ファイルの撮影日を取得するマクロのバグ対応を処置して更新しています。
2024/11/24 18:53 ExcelFlowChart:試してみたいと思います。ありがとうございます。
2024/09/09 11:11 MoveSheetstoOtherBook:ありがとうございます!
2024/09/05 09:38 GetJPNCodeStock:【管理人】Windows Updateによって、EdgeのVersionが上がったのであれば、Edgeドライバも最新にしてください
2024/09/05 09:35 GetJPNCodeStock:【管理人】確認しましたが、サイトに変更はないため、コードに変更はありません。
2024/08/30 12:50 GetJPNCodeStock:昨日がら取得エラーになってしまいます。
2024/08/10 09:40 MailDelete:削除済みに入っているようです。確認不足で申し訳ありませんでした。
2024/08/08 10:53 MailDelete:受信タイミングで deleteした場合削除済みに入らず、消えてしまうようなのですが、削除済みに入れれますか。
2024/08/08 10:19 MailDelete:受信タイミングで Call item.Delete
2024/08/05 13:32 MoveSheetstoOtherBook:【管理人】フォルダ参照へのリンクミスを修正
2024/08/05 11:02 AllFile-Trimming:【管理人】保存フォルダを開くボタンの追加と対象画像ファイルを明記しました。あとは、パスが長すぎると保存できないかもしれません。
2024/07/31 19:34 AllFile-Trimming:画像をまとめて一括でトリミング出来るツールを探していて、こちらにたどり着きました。DLさせていただいたのですが、トリミングした写真が保存できません。使用方法が間違っているのでしょうか?
2024/06/02 08:11 MailDelete:【管理人】コメントありがとうございます。質問はうちの記事と関係なそそうですが、「セル範囲のロック」で調べてみてください。
2024/07/24 09:49 MailDelete:ハイパーリンクを消そうとすると「選択範囲が保護されており・・」で出来ません、良い方法をご教示ください。
2024/07/24 09:34 MailDelete:まさにほぼ同じブラックリストで削除するのが大変でした。私は迷惑メールホルダーに隔離していますが、
2024/06/13 14:04 SearchWordFileTool:【管理人】ワード(Word)ファイルの検索(正規表現検索)を行うGrep風ツールで図形検索を追加対応しました。
2024/06/12 16:26 SeikiHyougenTool:【管理人】エクセルで正規表現検索と置換を行うためのツールに図形内文書も追加対応しました。
2024/06/06 22:03 FixNumbering:【バグ対応】章番号や項目番号の連番を自動訂正 正規表現の半角/全角 区別を修正(IgnoreCase=TRUEをFALSEに変更)
2024/06/02 08:11 SeikiHyougenTool:【管理人】新規記事の追加「エクセルで正規表現検索を行うためのツール」
2024/06/02 08:09 StringOperation-VBA:【管理人】バグ対応「文字列操作・正規表現」半角/全角 区別の判定が逆だったので、訂正。
2024/05/13 11:09 inputSupport-ShortCut:【管理人】バグ対応「自作カレンダーフォームをショートカットキーで呼び出そう」で複数ブックからの呼び出しで既にブックが閉じられていた場合の処置が抜けていたので追記
2023/08/31 10:01 CalendarForm:8/29に質問をしたものです。自己解決できましたので連絡いたします。お騒がせいたしました。
2023/08/29 10:24 CalendarForm:お世話になっております、「クラス型の変数を配列定義」の部分で「ユーザー定義型が定義されていません」と表示されてしまいます。何か確認、設定すべき事項はありますでしょうか?
2023/08/28 13:40 GetFilesPath:【管理人】バグ対応 ファイルリストの作成(GetAllFile)呼び出しの変更
2023/08/28 13:39 Supportffmpeg:【管理人】記事追加のおしらせ。ffmpegを使用した動画編集補助ツールの記事を追加しました。
2023/07/16 23:38 StringOperation-VBA:【管理人】RExp_FindStrArr関数で一致文字列が見つからない場合のバグ対応を実施
2023/07/03 18:40 ExcelFlowChart:【管理人】フローチャート入力補助ツールにコメント文をテキスト出力する機能を追加しました
2023/06/24 14:50 GetFilePath:【管理人】ファイル参照(初期フォルダ指定)のバグ対応を行いました
2023/06/12 12:13 CalendarForm:【管理人】カレンダーフォームを祝日表示に対応させました。
2023/06/07 12:35 CalendarForm:コメントありがとうございます。自作のカレンダフォームは、祝日に対応していません。
2023/06/07 09:51 CalendarForm:大変参考になります。祝日を列挙したシートがありますが、祝日を赤色にする方法はご説明されていますでしょうか
2023/06/07 09:51 inputSupport-ShortCut:祝日を列挙したシートがありますが、祝日を赤色にする方法はご説明されていますでしょうか
2023/05/19 14:09 Init-Excel:管理人による書き込み確認