複数のシートのデータをすべてCSVファイルに保存する方法
「Excel」シートのデータをCSV形式データとして保存したい場合は、「名前を付けて保存」からファイルの種類を「CSV(カンマ区切り)(*.csv)」を選択して保存すれば作成できます。しかし、現在表示されているシートしか保存ができないので複数シートをCSV形式にしたい場合は作業が面倒です。
そこで、ブック内のすべてのシートのデータをCSVファイルとして保存するコードをご紹介します。
「名前を付けて保存」に相当するWorkbook【ワークブック】オブジェクトのSaveAS【セーブアズ】メソッドで引数FileFormat【ファイルフォーマット】を指定することでCSVファイルは作成できますが、今回は、Open 【オープン】ステートメントPrint # 【プリントハッシュ】ステートメントを利用して、直接CSVファイルに出力する方法をご紹介します。
Print #【プリントハッシュ】ステートメント
Print #【プリントハッシュ】ステートメントの書式と設定値(引数)の説明
[]内は省略可能です。
Print # filenumber, [outputlist]
- filenumber【ファイルナンバー】(必須)
任意のファイル番号(Open【オープン】ステートメントで設定したファイル番号)を指定します。 - outputlist【アウトプットリスト】(省略可)
出力する式や数式または文字列式を指定します。
outputlist 【アウトプットリスト】の設定書式 |
---|
[]内は省略可能です。 [{Spc(n) | Tab[(n)]}] [expression] [charpos] |
設定 | 説明 |
---|---|
Spc( n ) | 空白文字を挿入するときに使用します。 n は挿入する空白文字の数です。 |
Tab( n ) | 挿入ポイント指定するときに使用されます。n は列番号です。 引数を指定しないと、次の出力領域の先頭に配置されます。 |
expression | 出力する数式または文字列式です。 |
charpos | 次の文字の挿入ポイントを指定します。 改行しないで続けて出力する場合はセミコロン(;)を使用します。 charpos を省略すると、次の文字は次の行に出力されます。 |
「Output」または「Append」モードで開かれた「#番号」ののファイルにデータを書き込みます。
Open【オープン】ステートメント
テキストファイルをパソコン内部で開くには、Open【オープン】ステートメントを使用します。
Open【オープン】ステートメントの書式と設定値の説明
Open Pathname For Mode As #Filenumber
- Pathname【パスネーム】(必須)
開きたいテキストファイルの名前を含むパスを文字列型で指定
します。ファイル名だけを指定した場合は、カレントフォルダ-のファイルが対象になります。また、指定したファイルが存在しない場合は、引数ModeにInput以外のモードが指定されている場合、指定したファイルが新規で作成されます。
- Mode【モード】(必須)
ファイルを開くときのモードを以下のキーワードで指定します。モード名 内容 Input
【インプット】読み込み Output
【アウトプット】書き込み Append
【アペンド】追加 Binary
【バイナリ】バイナリデータ
テキスト以外のデータRandom
【ランダム】ランダムアクセス
データベースにアクセス - Filenumber【ファイルナンバー】(必須)
開いたファイルに番号を割り当てます。1~511の値を使用します。
複数のシートのデータをすべてCSVファイルに保存するコードと解説
Sub CSV保存() Dim フォルダ名 As String Dim パス名 As String Dim ファイル名 As String Dim データ As Variant Dim 行数 As Long Dim 列数 As Long Dim i As Long Dim j As Long Dim k As Long フォルダ名 = ActiveWorkbook.Name フォルダ名 = Left(フォルダ名, Len(フォルダ名) - 5) パス名 = ActiveWorkbook.Path & "¥" & フォルダ名 If Dir(パス名, vbDirectory) = "" Then MkDir パス名 End If ChDir パス名 Application.ScreenUpdating = False For i = 1 To Worksheets.Count Worksheets(i).Activate Range("A1").CurrentRegion.Select 行数 = Selection.Rows.Count 列数 = Selection.Columns.Count ファイル名 = ActiveSheet.Name & ".csv" Open ファイル名 For Output As #1 For j = 1 To 行数 For k = 1 To 列数 - 1 データ = Selection.Cells(j, k).Value Print #1, データ; ","; Next k Print #1, Selection.Cells(j, 列数).Value Next j Close #1 Next i Application.ScreenUpdating = True MsgBox ThisWorkbook.Path & フォルダ名 & " フォルダーにCSVファイルを出力しました。" End Sub
各変数の変数宣言です。
11行目【 フォルダ名 = ActiveWorkbook.Name 】
Workbook【ワークブック】オブジェクトのName【ネーム】プロパティを使用して、このブックの名前を取得して変数「フォルダ名」に代入します。
12行目【 フォルダ名 = Left(フォルダ名, Len(フォルダ名) – 5) 】
文字列の左から指定した文字数分の文字列を取り出すLeft【レフト】関数を使用して変数「フォルダ名」に格納されている文字列の文字数を文字列の長さを取得するLen【レン】関数で文字列の数を取得し、変数「ファイル名」に格納されているファイル名の拡張子部分(.xlsm)5文字分を減算して拡張子の無いファイル名を取得して変数「ファイル名」に改めて代入します。
13行目【 パス名 = ActiveWorkbook.Path & “¥” & フォルダ名 】このブックのパス(保存場所)と変数「フォルダ名」に格納されているファイル名を変数「パス名」に代入します。このブックが新規のブックで一度も保存されていないときは、このブックのパス(保存場所)が確定していないのでエラーになります。
14行目【 If Dir(パス名, vbDirectory) = “” Then 】
If【イフ】ステートメント(条件分岐)を使用して、条件式としてDir【デレクトリ】関数の第二引数をvbDirectoryにして変数「パス名」と同じ名前のフォルダーがないか探します。Dir【デレクトリ】関数の戻り値が長さ0文字の文字列「””」と等しいときを定義します。つまり変数「パス名」に格納されている「パスとファイル名」と同じフォルダーが存在しない場合を定義します。
15行目【 MkDir パス名 】
14行目の条件分岐が成立したら、すなわちパス名と同じ名前のフォルダがなかった場合に新規フォルダーを作成するMKDir【メイクデレクトリ】ステートメントで変数「パス名」に格納されている名前すなわち、このブック名でフォルダを作成します。
17行目【 ChDir パス名 】
ChDir【チェンジデレクトリ】ステートメントは、現在のフォルダ(カレントフォルダ)を指定した名前のフォルダにする関数です。指定した名前のフォルダが無い場合はエラーになります。ここでは、カレントフォルダを変数「パス名」に格納された名前のフォルダに指定しています。
18行目【 Application.ScreenUpdating = False 】
Application【アプリケーション】オブジェクトのScreenUpdating【スクリーンアップディーティング】プロパティにFalseを設定して、処理の高速化のために画面更新を抑止します。
19行目【 For i = 1 To Worksheets.Count 】
For【フォー】ステートメントで繰り返し処理の始まりです。カウンター変数「i」に1からWorksheets【ワークシーツ】コレクションの
Count【カウント】プロパティで取得したワークシートの数分を順次代入して繰り返します。
シート枚数分の繰り返し処理になります。
20行目【 Worksheets(i).Activate 】
繰り返し処理の中で左のワークシートから順にアクティブにしています。
21行目【 Range(“A1”).CurrentRegion.Select 】
アクティブシートのA1セルから始まるデータ範囲をRaneg【レンジ】オブジェクトのCurrentRegion【カレントリージョン】プロパティで参照してRange【レンジ】オブジェクトのSelect【セレクト】メソッドで選択します。
22行目【 行数 = Selection.Rows.Count 】
Application【アプリケーション】オブジェクトのSelection【セレクション】プロパティで現在選択されているセル範囲を参照してRows【ロウズ】プロパティで参照されているセルのすべての行を参照し、Count【カウント】プロパティで行数を取得して変数「行数」に代入します。
23行目【 列数 = Selection.Columns.Count 】
Application【アプリケーション】オブジェクトのSelection【セレクション】プロパティで現在選択されているセル範囲を参照してColumns【カラムズ】プロパティで参照されているセルのすべての列を参照し、Count【カウント】プロパティで列数を取得して変数「列数」に代入します。
24行目【 ファイル名 = ActiveSheet.Name & “.csv” 】
Worksheet【ワークシート】オブジェクトのName【ネイム】プロパティでアクティブシートのシート名を取得して、変数「ファイル名」に「シート名.csv」という形でファイル名を代入をします。最後の拡張子を「csv」から「txt」に変更するとテキスト形式でメモ帳直接に書き出すことができます。
25行目【 Open ファイル名 For Output As #1 】
テキストファイルを開くOpen【オープン】ステートメントを使用して変数「ファイル名」のテキストファイルをOutput(書き込み)モードで、ファイル番号を「#1」番のファイルを開きます。
26行目【 For j = 1 To 行数 】
for【フォー】ステートメントで繰り返し処理の始まりです。カウンタ―変数のJに1から変数「行数」を順に代入します。
27行目【 For k = 1 To 列数 – 1 】
for【フォー】ステートメントで繰り返し処理の始まりです。カウンタ―変数のkに1~(変数「列数」-1)を順に代入します。
列数-1にするわけは、最終列の一つ前までは改行しないようにして、最後の列で改行する処理があるためです。
28行目【 データ = Selection.Cells(j, k).Value 】
まずは、データのj行目の各列の一つ手前までのデータを変数「データ」に格納します。
29行目【Print #1, データ; “,”;】
【Print #1, データ; “,”;】
Print #【プリントハッシュ】ステートメントでデータを書き出します。カンマ区切りデータなのでカンマを追加します。各出力する文字列のあとにはセミコロン「;」を記述して改行されないようにします。
30行目【 Next k 】
ここまでが、カウンター変数Kの繰り返し処理で、まずは行は固定で列のデータを最終列の一つ手前の列まで#1ファイルに書き出します。
31行目【 Print #1, Selection.Cells(j, 列数).Value 】
Print #【プリントハッシュ】ステートメントで、最終列のデータを#1ファイルに書き出しています。データの最後にセミコロンがないのでここで改行されます。ここまでで、1行分のデータが書き込まれ改行されたことになります。
32行目【 Next j 】
ここまで、26行目からの処理をデータの行数分の回数繰り返してシートのデータを#1ファイルに書き込みます。
33行目【 Close #1 】
ここで、シートのデータが書き込まれた#1ファイルを閉じてデータの書き込みを確定します。
34行目【 Next i 】
ここまでの処理をシートの枚数分の回数繰り返して各シートのデータを各シート名をつけて#1テキストファイルに書き出し処理をします。
35行目【 Application.ScreenUpdating = True 】
繰り返し処理が終了したので高速化のため抑止していた画面の更新を再開します。
36行目【 MsgBox ThisWorkbook.Path & フォルダ名 & ” フォルダーにCSVファイルを出力しました。”】
MsgBox【メッセージボックス】関数を使用してファイルの出力先を伝えます。
以上で、複数のシートのデータをすべてCSVファイルに保存する方法の解説を終了します。
ありがとうございました。