【エクセルVBA初心者用】手軽にCSVデータを作る
エクセルでCSVデータを作るときに、エクセル標準の機能だけでCSVデータを作るときには、次のような手順で操作をする必要があります。
- CSV化したいシートを表示
- 「名前を付けて保存」でCSVデータとして保存
- (エクセルをいったん閉じる)
実際に、この操作をしてみるとわかりますが、この処理は、意外に手間がかかります。
さらに、この手順で作成したCSVファイルは、作成されたファイルの拡張子が「.csv」となってしまうため、そのままでは使いにくい場合もあります。
たとえば、弥生会計に仕訳データをインポートする場合、インポート画面の初期状態では、拡張子が「.txt」のファイルしか表示されません。そのため、「.csv」のファイルを読み込むためには、いったん「すべてのファイルを表示する」操作をしてからでないと読み込むことができません。そうかといって、毎回、拡張子を「.txt」に変更するのも面倒です。
そこで、今回は、VBAでマクロを作ってCSVデータを作る方法を紹介します。VBAでCSVファイルを出力するようにすれば、手間なく、好きな拡張子でファイルを作成することができるようになります。
この記事の目次
今回作るプログラムの概要
今回は、「csv」シートのデータをCSVデータとして出力します。
また、エクセルファイルと同じ場所に、同じ名前で、拡張子を「.txt」にしてファイルを作成します。たとえば、元々のファイルが「C:¥excel¥data.xlsm」であれば、CSVファイルを「C:¥excel¥data.txt」という名前で保存します。
エクセルの標準機能を自動実行するマクロを作る
VBAを使ってCSVファイルを作る方法には、いろいろあります。ここでは、できるだけエクセルの標準機能を使ってCSVファイルを作る方法を紹介します。
なお、きめ細かい処理をしたい場合には、すべての処理をVBAで行うようにしましょう。その方法は、下記ページで解説しています。
標準モジュールに入力するVBAのプログラム
それでは、実際にプログラムを入力してみます。
下記のプログラムを標準モジュールに入力してください。
「標準モジュール」と言われても、ピンと来ないときには、先に下記ページをご覧ください。
Sub CSVシートをCSV形式で保存()
Const EXT = ".txt" '拡張子
Const SHEET = "csv" 'CSV化するシートのシート名
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim iWb As Workbook '起動元のブック ※あらかじめ保存しておく必要あり
Set iWb = ThisWorkbook
iWb.Worksheets(SHEET).Copy
Dim oWb As Workbook 'コピー先のブック
Set oWb = ActiveWorkbook
Application.DisplayAlerts = False
oWb.SaveAs iWb.Path & "¥" & FSO.GetBaseName(iWb.Name) & EXT, FileFormat:=xlCSV, local:=True
Application.DisplayAlerts = True
oWb.Close
iWb.Activate
MsgBox "ファイルを保存しました"
End Sub
このプログラム(マクロ)を実行すると、csvシートの内容がCSVファイルとして保存されます。
なお、一回も保存したことがないエクセルファイルで、このプログラムを実行するとエラーが出ます。このプログラムを実行する前に、一度はエクセルファイルを保存しておいてください。
プログラムの解説
それでは、プログラムの中身を解説していきます。
定数宣言
Const EXT = ".txt" '拡張子
Const SHEET = "csv" 'CSV化するシートのシート名
このプログラムで使う定数を宣言しています。出力するときの拡張子や、出力対象となるシート名を変えたいときには、ここを変えましょう。
FileSystemObjectの宣言
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
FileSystemObjectオブジェクトを使うための文です。後で、ファイル名から拡張子を取り除くときに使います。
起動元ブックを変数「iWB」に格納
Dim iWb As Workbook '起動元のブック ※あらかじめ保存しておく必要あり
Set iWb = ThisWorkbook
今回、起動元ブック(=このマクロが入っているブック=ThisWorkbook)を変数「iWB」にセットしています。
以降、「iWB」を起動元ブックの別名として使うことができます。
「CSV」シートをコピーして、別ブックを作成する
iWb.Worksheets(SHEET).Copy
「iWB」の「Worksheets(SHEET)」を「Copy」して、別ブックを作成します。
この文を理解するためには、以下の3つのポイントを押さえましょう。
- 1. 「iWB」→「起動元ブック」
-
「iWB」は、「起動元ブック」を表しています。
- 2. 「SHEET」→「"csv"」
-
このプログラムの2行目で、定数SHEETには「csv」という値を入れています。
ですから、「Worksheets(SHEET)」は「Worksheets("csv")」、つまり「CSV」シートを表すことになります。
- 3. 引数なしのCopyメソッド=別ブックへのコピー
-
Copyメソッドは、引数を指定しない場合には、指定したシートを別ブックにコピーする意味になります。
つまり、この文は、「起動元ブック」の「csvシート」を「別ブックにコピー」するという意味になります。
コピー先のワークブックを変数「oWB」に格納
Dim oWb As Workbook 'コピー先のブック
Set oWb = ActiveWorkbook
先ほどの、Copyメソッドを使うと、シートがコピーされた後、「コピー先のシート」がアクティブな状態になります。
そこで、変数oWBに現在アクティブなブック(ActiveWorkbook)を入れることで、コピー先のワークブックを変数oWBにセットすることができます。
以降、「oWB」を、コピー先のブックの「別名」として使うことができます。
コピー先のワークブックをCSV形式で保存
Application.DisplayAlerts = False
oWb.SaveAs iWb.Path & "¥" & FSO.GetBaseName(iWb.Name) & EXT, FileFormat:=xlCSV, local:=True
Application.DisplayAlerts = True
17行目の「oWB.SaveAs」の行で、コピー先のWorkbookを「名前を付けて保存」する処理をしています。
ただし、それだけだと、各種警告メッセージが表示されて邪魔です。
そこで、16行目の「Application.DisplayAlerts = False」で警告メッセージを表示させないようにして、18行目の「Application.DisplayAlerts = True」で、元に戻します
17行目の「oWB.SaveAs」の引数は、次のように指定をしています。
- 保存するファイル名
-
保存するファイル名は「iWb.Path & "¥" & FSO.GetBaseName(iWb.Name) & EXT」で表されます。
たとえば、元々のファイルが「C:¥excel¥data.xlsm」という名前だった場合、先ほどの式は、次の4つを結合した結果になります。
式 式の計算結果 補足 iWb.Path C:¥Excel 起動元ブックのファイルパス(=格納されているフォルダ) "¥" ¥ FSO.GetBaseName(iWb.Name) data ファイル名「data.xlsm」の「.」以降を取り除いた部分 EXT .txt 1行目で定義した定数EXTの内容 計算結果 C:¥Excel¥data.txt - その他の引数
-
引数 意味 FileFormat:=xlCSV CSVファイルとして出力する local:=True 日付データを、正しい書式(yyyy/mm/dd形式)でCSVデータに出力します
※これを指定しない場合、日付の形式が変わってしまいます。
コピー先のワークブックを閉じる
oWb.Close
コピー先のワークブックを閉じます。
元のワークブックを表示する
iWb.Activate
元のワークブックを表示します。
処理終了のメッセージを表示する
MsgBox "ファイルを保存しました"
メッセージボックスに「ファイルを保存しました」と表示します。
マクロを実行する
上記マクロを実行すると、csvシートの内容がCSVファイルに保存されます。
さらに、このマクロをショートカットキーに割り当てると、キー操作だけで、マクロが起動できるようになります。たとえば、Ctrl+Shift+Zに、このマクロを割り当てれば、Ctrl+Shift+Zを押すだけでCSVファイルを出力することができます。
ショートカットキーを割り当てる手順は、下記ページをご覧ください。
まとめ
マクロを使うことで、面倒なCSV出力作業を、ボタン1つでできるようにになります。
まずは、この記事のような、手軽な方法で自動化をしてみてください。