このページではExcelブックから、特定のシートを個別のファイル(単独のブック)として出力するサンプルコードを紹介します。
一見長いコードに見えるかもしれませんが、標準モジュールにコピペして、出力したいシートを指定するだけで簡単に使用できるようにしているのでぜひ使ってみてください。
シートの指定方法など、サンプルコードの編集方法についても解説しています。
サンプルファイルも貼っておきますので、実際に動かして動作を確認してみてください。
サンプルコード(簡易版)
Sub ファイル出力_簡易版()
'=====変数指定=====
Dim SheetName As String, BookName As String
'◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
'出力対象シートの指定
'SheetName = "見積書" '文字列で対象シート名を指定
SheetName = Sheet1.Name 'オブジェクト名で指定(推奨)
'SheetName = Sheets(1).Name 'インデックス№で指定
'出力ファイル名(ブック名)の指定
BookName = SheetName & "_" & Format(Now, "yyyy-mmdd-hhmm") 'シート名_出力日時
'BookName = "ファイル名" '(指定例)
'◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
'=====新規ブック作成=====
Dim NewWB As Workbook
Set NewWB = Workbooks.Add
'=====対象シートのコピー=====
ThisWorkbook.Sheets(SheetName).Copy Before:=NewWB.Sheets(1)
'=====雑処理=====
With NewWB.Sheets(1)
'◆コピー先シートで行う雑処理はここに記載◆
'(例)シート全体をコピーして値として貼り付け
.Activate
.Cells.Copy
.Cells.PasteSpecial Paste:=xlPasteValues
.Range("A1").Select '全体選択の解除
'(例)不要列の削除
.Range("V:Z").Delete 'V~Z列にある実行ボタンを削除
'◆____雑処理の記載はここまで____◆
End With
'=====警告表示の停止=====(シート削除・上書き保存時の警告を無視)
Application.DisplayAlerts = False
'=====新規ブック作成に伴い発生した空白シートを削除=====
Dim WS As Worksheet
For Each WS In NewWB.Worksheets
Select Case WS.Name
Case "Sheet1", "Sheet2", "Sheet3"
WS.Delete
End Select
Next
'=====保存して閉じる=====
NewWB.Close SaveChanges:=True, Filename:=ThisWorkbook.Path & "\" & BookName
'=====警告表示の再開=====(シート削除・上書き保存時の警告を再開)
Application.DisplayAlerts = True
End Sub
こちらのコードは最低限これは必要かなと思う処理だけを記載しています。
具体的な処理はコメントに記載していますが、簡単にまとめると次のようになります。
- 新規ブックを作成
- 出力するシートを新規ブックにコピー
- 数式の値化(値として貼り付け)
- 新規ブック作成時にあった空白シートを削除
- 保存してブックを閉じる
見てのとおり、手順としては、新しいブックにシートごとコピーして、保存している感じです。
サンプルコード(出力先指定版)
Sub ファイル出力_出力先指定()
'=====変数指定=====
Dim SheetName As String, BookName As String, OutDir As String
'◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
'出力対象シートの指定
'SheetName = "見積書" '文字列で対象シート名を指定
SheetName = Sheet1.Name 'オブジェクト名で指定(推奨)
'SheetName = Sheets(1).Name 'インデックス№で指定
'出力ファイル名(ブック名)の指定
BookName = SheetName & "_" & Format(Now, "yyyy-mmdd-hhmm") 'シート名_出力日時
'BookName = "ファイル名" '(指定例)
'出力先ディレクトリの指定
OutDir = ThisWorkbook.Path 'カレントディレクトリ
'OutDir = "C:\" '(指定例)
'◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
'=====画面更新・イベント・警告を停止=====
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
'=====新規ブック作成=====
Dim NewWB As Workbook
Set NewWB = Workbooks.Add
'=====対象シートのコピー=====
ThisWorkbook.Sheets(SheetName).Copy Before:=NewWB.Sheets(1)
'=====雑処理=====
With NewWB.Sheets(1)
'◆コピー先シートで行う雑処理はここに記載◆
'(例)シート全体をコピーして値として貼り付け
.Activate
.Cells.Copy
.Cells.PasteSpecial Paste:=xlPasteValues
.Range("A1").Select '全体選択の解除
'(例)不要列の削除
.Range("V:Z").Delete 'V~Z列にある実行ボタンを削除
'◆____雑処理の記載はここまで____◆
End With
'=====新規ブック作成に伴い発生した空白シートを削除=====
Dim WS As Worksheet
For Each WS In NewWB.Worksheets
Select Case WS.Name
Case "Sheet1", "Sheet2", "Sheet3"
WS.Delete
End Select
Next
'=====保存して閉じる=====
ActiveWorkbook.Close SaveChanges:=True, Filename:=OutDir & "\" & BookName
'=====画面更新・イベント・警告を再開=====
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
'=====メッセージ表示=====
MsgBox "ファイルを出力しました。", vbInformation
End Sub
こちらのコードは簡易版に少しだけ処理を追加しています。
簡易版との違いは次の太字の部分です。
- 出力先(フォルダパス)指定
- 新規ブックを作成
- 画面更新等を停止
- 出力するシートを新規ブックにコピー
- 数式の値化(値として貼り付け)
- 新規ブック作成時にあった空白シートを削除
- 保存してブックを閉じる
- 画面更新等の再開
- 終了メッセージの表示
ポイントは、出力先ディレクトリ(出力先フォルダ)を事前指定できるようにした点です。
また、この手の処理は画面がチラつくので、画面更新を停止するのもマナーです。
サンプルコード(おすすめ版)
Sub ファイル出力_おすすめ()
'=====変数指定=====
Dim SheetName As String, BookName As String
'◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
'出力対象シートの指定
'SheetName = "見積書" '文字列で対象シート名を指定
SheetName = Sheet1.Name 'オブジェクト名で指定(推奨)
'SheetName = Sheets(1).Name 'インデックス№で指定
'出力ファイル名(ブック名)の指定
BookName = SheetName & "_" & Format(Now, "yyyy-mmdd-hhmm") 'シート名_出力日時
'BookName = "ファイル名" '(指定例)
'◆◆◆◆◆ユーザー指定部分◆◆◆◆◆
'=====実行確認=====
If MsgBox(SheetName & "シートを出力します。" & vbCrLf & _
"よろしいですか?", vbQuestion + vbYesNo) = vbNo Then
MsgBox "中止しました。"
Exit Sub
End If
'=====出力先フォルダ選択=====
Dim OutDir As Variant
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = False Then Exit Sub
OutDir = .SelectedItems(1)
End With
'=====画面更新・イベント・警告を停止=====
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
'=====新規ブック作成=====
Dim NewWB As Workbook
Set NewWB = Workbooks.Add
'=====対象シートのコピー=====
ThisWorkbook.Sheets(SheetName).Copy Before:=NewWB.Sheets(1)
'=====雑処理=====
With NewWB.Sheets(1)
'◆コピー先シートで行う雑処理はここに記載◆
'(例)シート全体をコピーして値として貼り付け
.Activate
.Cells.Copy
.Cells.PasteSpecial Paste:=xlPasteValues
.Range("A1").Select '全体選択の解除
'(例)不要列の削除
.Range("V:Z").Delete 'V~Z列にある実行ボタンを削除
'(参考)不要行の削除
'.Range("5:20").Delete '5~20行を削除
'(参考)枠線の表示
'.ActiveWindow.DisplayGridlines = True
'(参考)行列番号の表示
'.ActiveWindow.DisplayHeadings = True
'◆____雑処理の記載はここまで____◆
End With
'=====新規ブック作成に伴い発生した空白シートを削除=====
Dim WS As Worksheet
For Each WS In NewWB.Worksheets
Select Case WS.Name
Case "Sheet1", "Sheet2", "Sheet3"
WS.Delete
End Select
Next
'=====保存して閉じる=====
ActiveWorkbook.Close SaveChanges:=True, Filename:=OutDir & "\" & BookName
'=====画面更新・イベント・警告を再開=====
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
'=====メッセージ表示=====
MsgBox "ファイルを出力しました。", vbInformation
End Sub
こちらのコードは出力先をダイアログボックスで都度指定できるようになっています。
簡易版との違いは次の太字の部分です。
- 実行確認
- 出力先のダイアログ選択
- 新規ブックを作成
- 画面更新等を停止
- 出力するシートを新規ブックにコピー
- 数式の値化(値として貼り付け)
- 新規ブック作成時にあった空白シートを削除
- 保存してブックを閉じる
- 画面更新等の再開
- 終了メッセージの表示
- エラー時処理
「画面更新等の停止」に関しては、イベントや警告も停止しています。
イベントや警告の停止は、ケースバイケースで判断すべき点ですが、参考にしていただければと思います。
また、コピー先シートで行う雑処理として、よく使うと思われるいくつかの処理をコメントとして参考記述しています。
必要な方はコメントを外し、範囲指定部分を編集して使ってみてください。
ユーザー指定部分の編集方法
出力対象シートの指定
ここでは「SheetName」という変数へ、出力するシートのシート名を格納しています。
指定方法はコードにも3パターンを(使うもの以外はコメントとして)記述していますが、どれでもかまいません。
3パターンの特徴について簡単に解説しておきます。
シート名の直接記述
シート名をコードに直接記述する場合は次のようにします。(例)シート名が「見積書」の場合
SheetName = “見積書”
ただし、シート名をコードに直接記述する場合、シート名が変わるとエラーになってしまうため、安全性とメンテナンス性からあまりオススメできません。
インデックス№での指定
インデックス№(出力するシートがブックの左から何番目にあるか)での指定は、常に出力するシートの位置が決まっている場合に使えます。
例えば出力するシートが常に一番左(1番目)にあるときは次のように指定します。
SheetName = Sheets(1).Name
当然、シートの位置が変われば別のシートが出力されるため注意が必要です。
少し特殊かもしれませんが、新しいシートが特定の位置にどんどん追加され、その追加されたシートを毎回出力したいような場合などはこの方法が向いています。
オブジェクト名での指定(おすすめ)
安全性が高くおすすめなのはオブジェクト名での指定で、オブジェクト名が「Sheet1」の場合は次のように指定します。
SheetName = Sheet1.Name
オブジェクト名は、通常、エディターの左上に表示されているボックス(プロジェクトエクスプローラー)で確認できます。(図の赤枠の部分が、シートのオブジェクト名)
私はこの指定方法が一番おすすめだと思っています。
出力ファイル名(ブック名)の指定
サンプルコードでは「BookName」という変数へ、出力するシートのシート名を格納しています。
単純に出力時に指定したいファイル名を記述するだけでOKです。
BookName = “見積書ファイル”
ただし、これでは前回出力したファイルがすでにあるとき、上書き確認が出てしまいます。
もちろん、そういった警告を無視して処理を進める「Application.DisplayAlerts = False」を、新規ブックを作成するより前の位置に記述すれば上書き確認の表示はなくなりますが、だまって上書きされてしまいます。
さすがにこれはリスクが高いためオススメできません。
こういったことを防ぐためには、ファイル名をできるだけ重複しないようにしておくのが無難です。
例えば、ファイル名に、連番や出力時の日付日時を自動で追加する方法がよく使われますね。
今回のサンプルコードでは、出力時の日付日時を自動で追加するコード「Format(Now, “yyyy-mmdd-hhmm”)」を記述していますのでご参考ください。よく使われるコードですね。
具体的には次のように記述してあり、出力すると「シート名_出力日時」となります。
BookName = SheetName & “_” & Format(Now, “yyyy-mmdd-hhmm”)
「ShhetNm」には先に指定したシート名が入ります。
任意のファイル名に出力日時を付けるなら次のようなイメージです。
BookName = “見積書” & “_” & Format(Now, “yyyy-mmdd-hhmm”)
なお、このコードでは”分”までしか表示できません。
なので、1分以内に複数回の出力処理をすると、当然ながら上書き確認が出てしまいます。
絶対に上書き確認を出したくないなら、次のような記述で秒までを表示してしまえばいいと思います。
BookName = SheetName & “_” & Format(Now, “yyyy-mmdd-hhmmss”)
出力処理に数秒かかることからすれば、秒まで盛り込んでおけば上書き確認が表示されることはまずなくなるでしょう。
出力先フォルダの指定
サンプルコード(出力先指定版)では出力先フォルダを「OutDir」という変数に指定できるようにしています。
デフォルトでは出力元ファイルがあるフォルダと同じ場所(カレントディレクトリ)に出力するように指定してあります。
具体的な記述部分は次のとおり。
OutDir = ThisWorkbook.Path
これを変更する場合は、次のように具体的なディレクトリ(フォルダのパス)を指定してください。
OutDir = “C:\出力先フォルダ\”
ダブルクォーテーションでくくること、パスの最後に\を付けることを忘れないように。
コピー先シートでの雑処理
ここでは、出力先ブックでの雑処理について簡単に触れておきます。
ブック間参照をしているセルの値化
先に記載したとおり、シートの出力は新規ブックにシートを丸ごとコピーするというものです。
そのため、もしシート間を参照するような数式があると、シートをコピーするとき、自動的にブック間参照に変わってしまうため注意が必要です。
それを解消する方法として、サンプルコードでは「数式の値化」を記述しています。
ここで言う値化とは、数式によって表示されている内容を文字列に置き換えることを指しています。
記述例ではとりあえずシート全体を一括で値化(一旦シート全体をコピーし、値として貼り付け)していますが、シート間参照をしていない数式は残しても問題ありません。
その場合、コピーペーストの範囲を絞ってシート間参照のあるセルだけを値化をしたり、全体を値化した後にシート間参照のいらない箇所はVBAから数式を入れ直すなどするのがいいと思います。
もちろん、出力シートにシート間参照がない場合、「数式の値化」をするためのブロック自体が不要なので削除してもかまいません。(サンプルファイルのシートにはシート間参照がないのでじつは不要です。)
不要な列や行の削除
サンプルファイルをダウンロードして実行してもらうと、出力したファイルでは実行ボタンが消えていると思います。
出力したシートに実行ボタンが残っていると、ボタンに登録されているマクロリンクがブック間参照の状態になってしまうためです。(サンプルコードではボタンを列ごと削除しています。)
これはあくまで一例ですが、このように出力したシートから削除しておきたいものはけっこうあるのではないかと思います。
そういった処理を、雑処理の部分に記述しておくことで、自動的に処理することができます。
特によく使う処理としては、列の削除、行の削除、ほかにも目盛線(グリッド線)や見出し(行や列の番号等)の表示切替などではないでしょうか?
ほんのいくつかですが、サンプルコード(おすすめ版)のほうにはそういった処理の記述例をコメントで入れていますのでご参考ください。
まとめ
今回はシートのファイル出力をするためのサンプルコードを紹介させていただきました。
特定のシートをExcelブックの状態で出力保存できると、PDFと違って後で修正等ができるメリットがあります。
ぜひ使ってみてください。
なお、あくまで参考ですが、サンプルコード(簡易版)よりさらに簡略化した最小構成のコードも貼っておきます。
本当に必要な部分が何かを確認する意味で、よければご覧ください。
Sub ファイル出力_最小構成版()
'◆◆◆◆◆出力対象シート名/出力ブック名の指定◆◆◆◆◆
Dim SheetName As String, BookName As String
SheetName = Sheets("見積書").Name 'シート名で指定
BookName = SheetName & "_" & Format(Now, "yyyy-mmdd-hhmm") 'シート名_出力日時
'対象シートのコピー処理
Dim NewWB As Workbook: Set NewWB = Workbooks.Add '新規ブックを作成
ThisWorkbook.Sheets(SheetName).Copy Before:=NewWB.Sheets(1) '対象シートをコピー
'保存して閉じる
NewWB.Close SaveChanges:=True, Filename:=ThisWorkbook.Path & "\" & BookName
End Sub
コメント