プチIT化

【VBA】範囲を指定して別Excelファイルに出力するマクロ

こんばんは、わたあめです。今日は、Excelで指定した範囲を別ファイルで名前を付けて保存するVBAサンプルマクロを作ってみました。

選択した範囲だけ別ファイルにしたい時ってないですか?例えば、お客様に提出するファイルで、社内コメントを入れているがその部分見られたくない…といったケースなどです。

一部分を別Excelファイルに、名前を付けて保存していきます。今回は、例を使ったマクロサンプルとマクロの解説を記事にしていきますよ。それではいってみましょう!

マクロの作成・実行等は全て自己責任でお願いいたします。実行環境などによって動かない場合もあります。あくまでサンプルです。

サンプルマクロ

早速、以下の表を例にしたサンプルマクロを公開します。

売上の表で、項番・商品・短歌・数量・売上金額・社内コメントとあります。ですが、社内コメント列については見せたくないので、それ以外の列のみ別ファイルに貼り付けて別の名前を付けて保存していきます。出力する範囲は【A1:E7】のタイトルと社内コメント列以外です。サンプルマクロは以下です。

Sub rangeExport()

' ①変数定義
Dim tmpRng As Range
Dim fName As String

' ②範囲指定
Sheets("Sheet1").Range("A1:E7").Select
Set tmpRng = Selection

' ③ファイルの新規作成
Workbooks.Add

' ④選択範囲をコピー
tmpRng.Copy

' ⑤選択範囲を貼り付け
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteAll

' ⑥名前を付けて保存
fName = Application.GetSaveAsFilename(filefilter:="Excelファイル,*.xlsx,すべてのファイル,*.*")
If fName = "False" Then
  'キャンセルの場合
  Exit Sub
Else
  'ブックを保存する
  ActiveWorkbook.SaveAs Filename:=fName
End If

' ⑦ファイルを閉じる
ActiveWorkbook.Close

End Sub
わたあめ
わたあめ
次章でマクロの中身を解説していきますね!!

サンプルマクロの解説

サンプルマクロの大きな流れは以下です。

①変数定義  ②範囲指定  ③ファイルの新規作成  ④選択範囲をコピー  ⑤選択範囲を貼り付け  ⑥名前を付けて保存  ⑦ファイルを閉じる

①変数定義

利用する変数を定義しておきます。変数定義とは、簡単に言うとこのマクロでこの変数使うよ~と宣言することです。今回のマクロで定義した変数についての説明です。

tmpRng範囲を格納する変数
fName名前を付けて保存するダイアログから取得したファイル名を格納する変数

②範囲指定

別Excelファイルに移すデータの範囲を指定します。シート名と範囲はここで指定します。このような使い方をしていて、「シート名」で指定したシートの「範囲」で指定した範囲を選択しています。

Sheets("シート名").Range("範囲").Select

今回のサンプルマクロでは、シート名がSheet1、範囲がA1:A7の範囲としています。指定した範囲は、tmpRngに一時的に格納します。選択した範囲をセットしているという文です。

Set tmpRng = Selection

一時的に格納する理由ですが、この後の新規ワークブックを作成します。Excelファイルを新規作成するとで新規ワークブックのSheet1のA1が自動的に選択されるようで、その範囲がSelectionとして塗り替わってしまうので、変数に入れる必要があるのです。次の処理で選択した範囲情報が消えてしまうから、一時的に変数に格納しておくという理解でOKですよ。

③ファイルの新規作成

新しくExcelファイル(ワークブック)を作成します。新規作成しても、まだ保存などはされていない状態で、Excelを新規に起動した状態です。新規に追加しますという文です。

Workbooks.Add

④選択範囲をコピー

②で選択した範囲を貼り付けるためにコピーします。範囲のデータを格納した変数のデータをコピーしています。

tmpRng.Copy

⑤選択範囲を貼り付け

④でコピーした範囲データを貼り付けます。まずは、列幅のみをコピーして、その後データ等をコピーします。貼り付けオプションのxlPasteAll(全て)を指定しても、列幅は貼り付けできないみたいです。

列幅を貼り付けするオプションのxlPasteColumnWidthsがありますが、貼り付けの対象が列幅情報のみだけになり、データまでは貼り付けされないので、列幅→データの2段階で貼り付けをしていきます。

列幅のコピーの使い方は以下です。

ActiveSheet.Range("貼付開始セル").PasteSpecial Paste:=xlPasteColumnWidths

データ等のコピーの使い方は以下です。

ActiveSheet.Range("貼付開始セル").PasteSpecial Paste:=xlPasteAll

どちらの貼り付けもオプションでどういう風に貼り付ける?が違うだけで、動きは同じです。Activeシートは、③で処理した新しく立ち上げしたExcelファイルとなっています。
新しく立ち上げたExcelファイルのシートのどこを起点に貼り付けるかをセル指定をしています。例では、A1(左上)を指定しています。

⑥名前を付けて保存

新しく立ち上げたExcelファイルにデータを貼り付け終わったので、名前を付けて別ファイルで保存していきます。(今は新規Excelファイルが立ち上がっているだけで、ファイルは保存できていない状態です。)

fName = Application.GetSaveAsFilename(filefilter:="Excelファイル,*.xlsx,すべてのファイル,*.*")
If fName = "False" Then
 'キャンセルの場合
 Exit Sub
Else
 'ブックを保存する
 ActiveWorkbook.SaveAs Filename:=fName
End If

「名前を付けて保存」ダイアログに記入したファイル名を利用してファイルを保存しています。キャンセルボタンが押された場合は、この処理を中断するという分岐処理を入れています。

⑦ファイルを閉じる

立ち上げていたExcelファイルを保存したので、ファイル自体を閉じます。

ActiveWorkbook.Close

マクロ使用の注意点

章立てするまでもないですが、このサンプルマクロで新たなExcelファイルを操作する時、ActiveSheetという書き方をしています。ActiveSheetは現在選択しているアクティブなシートという意味なので、処理中に他のExcelファイルを触らないようにお願いします。ActiveSheetが切り替わってしまう可能性があるからです。

ただ、マクロ処理は早いので、処理の間に別ファイルを触ったりする暇もないかもしれないですね。心配はあまりない?ような気もしていますが念のため!

さいごに

いかがだったでしょうか。VBAマクロを作成している方の参考になれば幸いです。それでは、また!

flier(フライヤー)