Excel

特定のシートだけ別ファイルとして名前をつけて保存する方法 -VBA基礎-

こんにちわ、マツコ先生 です。

特定のシートだけを別ファイルとして名前をつけて保存する方法でお困りではないでしょうか?

本記事でそんなお悩みを解決していきますよ!

本記事を読むことで
・特定のシートだけのエクセルファイルを生成できる
・保存するエクセルファイルに名前を指定して保
存できる

今回、紹介する方法のメリット

  • 開いているエクセルファイルとは別のファイルとして保存できる(特定シートだけ抽出できる)
  • 通常の"名前をつけて保存" においては、開いているエクセルファイルの名前が変わってしまうが、この方法によれば名前は変わらない。

完成イメージは次のようになります。
上段は、ファイルパスを取得して表示する処理を実装します。
下段は、上段のファイルパスの場所に、設定したファイル名を実装します。

ファイルパスを取得して表示する処理を記述する

上段のファイルパスを取得して表示する処理については、こちらの記事を参考に実装してください。

ファイル名を指定して保存する処理を記述する

ここでは、下段のファイル名を指定して保存する処理を記述していきます。
まず、ファイルパスを取得して表示する処理を記述している次の2つは記述済みの状態だと思います。
・Button1()
・GetFilePath()
ここに、ファイル名を指定して保存する処理を行う次の2つを記述していきます。
・Button2()
・SaveFileAsName()

完成イメージは次のようになります。
次の順番で処理が記述されています。
・Button1()
・Button2()
・SaveFileAsName()
・GetFilePath()

下段のボタン用の処理 "Button2()" について
処理は後から入力するので、次のように最低限の記述だけ入力します。
入力したら、一旦、保存してください。

まず、ファイルパスとファイル名を取得する処理 "SaveFileAsName()" を追加します。
Button2()の処理の下("End Sub"の下)に次のコードをコピー&ペーストします。

Function SaveFileAsName(targetWorkbook As Workbook, withSheetName As String, range_Path As String, range_Name As String)
'    Dim targetWorkbook As Workbook '保存したいブック
'    Dim withSheetName As String 'range_Pathとrange_Nameのシート名
'    Dim range_Path As String    '保存先ファイルパスの表示先セル
'    Dim range_Name As String    '保存時につけたい名前(ファイル名)の表示先セル

    Dim fullPath As String      '保存先ファイルパスとファイル名を連結したもの
    fullPath = targetWorkbook.Sheets(withSheetName).Range(range_Path) & "\" & targetWorkbook.Sheets(withSheetName).Range(range_Name)
    
    Call targetWorkbook.SaveCopyAs(fullPath)
    

End Function

ここからは、ボタンに直接割り付けている処理を入力していきます。
皆さんの状況に合わせてカスタマイズする場合は、ここを変更してください。

"Button2()" の処理は、ファイルパスとファイル名を取得することです。
具体的な処理は、 "GetFilePathAndName()" 内で行われますが、条件をここで設定しています。

withSheetName: ボタンや出力先セルがあるシート名称
fileType: 選択するファイルの種類(CSVファイルの場合は、"CSVファイル" を設定します)
fileExt: 選択するファイルの拡張子(CSVファイルの場合は、"*.csv" を設定します)
range_Path: 取得したファイルパスの出力先セル
range_Name: 取得したファイル名の出力先セル

今回は、このまま "Button2()" にコピー&ペーストですね!

Sub Button2()
    'ファイルを選択するとファイルパスとファイル名をセルに表示する処理を呼び出す
    Dim targetWorkbook As Workbook '保存したいブック
    Dim withSheetName As String 'range_Pathとrange_Nameのシート名
    Dim range_Path As String    '保存先ファイルパスの表示先セル
    Dim range_Name As String    '保存時につけたい名前(ファイル名)の表示先セル
    
    Set targetWorkbook = ThisWorkbook
    withSheetName = "sheet1"
    range_Path = "C4"
    range_Name = "C8"
    
    Call SaveFileAsName(targetWorkbook, withSheetName, range_Path, range_Name)
    
End Sub

これで完成です!難しいところがあったら復習しましょう。

完成したVBAをテストする

それでは、テストしてみましょう!
まずは、”ファイルパス取得” を押下してください・

ファイル選択のダイアログ(ウィンドウ)が開いたら、取得したいフォルダまでフォルダを選択していき、"OK" を押下します。

ボタンの隣のセルにファイルパスが表示されたら成功です!

次は、"シート名" と ”ファイル名" を入力 してください。
このとき、ファイル名には、拡張子(".xlsx" など)をつけないでください。

このとき、指定したシートには、次のような表を記載してあります。
このシートだけ別名で保存しようとしています。

次は、”名前をつけて保存” をクリックしてください

このとき、同じ名前のファイルがすでに存在している場合、次のようなアラートが表示されるので、上書き保存する場合は ”はい” をクリックしてください

指定したファイルパスの場所に、設定した名前のエクセルファイルが保存されていたら成功です!

保存したファイルを開いて、指定したシートだけ保存されていたら成功です!

まとめ

今回は特定のシートだけを別ファイルとして名前をつけて保存する方法をご説明しました。

複数のシートにて処理をした結果だけを出力したい(客先に結果だけを提出したい)場合など、特定シートだけのエクセルファイルを手動で作成すると作業ミスをしてしまうおそれがありますので、VBAで自動化することでミスを低減できます。

次の、"特定のシートだけを別ファイルとして名前をつけて保存をつけて保存するメリット” を再掲しますので、よく理解して今回の処理を活用していただけると幸いです。

  • 開いているエクセルファイルとは別のファイルとして保存できる(特定シートだけ抽出できる)
  • 通常の"名前をつけて保存" においては、開いているエクセルファイルの名前が変わってしまうが、この方法によれば名前は変わらない。

また、以下の記事もお困りの問題を解決するヒントになるかもしれないので、ぜひ参考にしてみてください!


-Excel