この記事では、EXCELに入力したデータをUTF-8形式のCSVファイルで出力する方法について説明しています。
カンマ区切り以外にも指定した文字で項目を区切ることもできます。
タブ区切りのテキストファイルも作成できます。
また、項目をダブルコーテーションでくくりたい場合、そのくくりたい文字を指定すれば可能となります。(例:”1,230″)
しかも、出力する列をヘッダー行(1行目)で判定します。
したがって、好きな列数でCSVファイルの作成が可能となっています。
一度この機能を作成しておけば、次から簡単にUTF-8形式でカンマ区切りのCSVファイルやタブ区切りのテキストファイルだって作成できるようになります。
それでは、EXCELに入力したデータをUTF-8形式のCSVファイルで出力する機能を作成していきましょう。
困っている女性
困っている女性
困っている女性
解決する男性
解決する男性
困っている女性
EXCELで入力したデータからUTF-8形式のCSVファイルを作成する機能に必要なものを、1つ1つ順番に説明していきます。
もくじ
1.作成するCSVファイル形式を指定するシートを作成する
まず、「区切り文字」、「くくり文字」、「CSVファイルパス」を指定する欄を作成します。
「CSVファイル作成」シートを作成する
- 「CSVファイル作成」という名前のシートを作成します。
- 1行目に「区切り文字」と「くくり文字」および「CSVファイルパス」のタイトル行を作成します。
- 2行目に「区切り文字」と「くくり文字」および「CSVファイルパス」を入力する欄を作成します
ちなみに、「区切り文字」をタブにしたい場合は、「TAB」と入力すれば、タブ区切りでファイルを作成します。
「TAB」以外の文字が入力されていれば、その入力した文字で区切られたファイルを作成します。
カンマ(,)を指定すれば、以下のようにCSVファイルを作成できます。
aaa,bbb,ccc,ddd
「くくり文字」は、入力された文字で項目をくくります。
くくり文字に「”」を入力した場合、以下の形式でファイルが作成されます。
“aaa”,”bbb”,”ccc”,”ddd”
また、くくり文字を未入力にした場合、項目をなにもくくらないので、以下の形式になります。
aaa,bbb,ccc,ddd
2.CSVファイルとして出力したいデータを準備する
それでは、出力したいデータを準備しましょう。
他のEXCELで作成されているデータなら貼り付けましょう。
「データ」シートを作成する
- 「データ」という名前のシートを作成します。
- あとは、好きなデータを入力もしくは貼り付けします。
上記の画像サンプルでは、1行目に項目のタイトル行(ヘッダー行)を入力していますが、必要ない場合入力しなくてもよいです。
ただし、1行目のデータで出力する列を判断します。
1行目に入力されている最大の列までが、ファイルに出力されます。
また、ファイルに出力される行は、A列に値が入力されている最大行までとなります。
3.VBAでCSVファイルを作成する機能を記入する
「Microsoft Visual Basic for Applications」を起動します。
標準モジュールを追加して、以下のソースを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
Public Sub MainProc() Dim shtMain As Worksheet Dim shtData As Worksheet Dim kugiri As String Dim kukuri As String Dim filePath As String Dim lastRow As Long Dim lastCol As Long Dim varData As Variant Dim i As Long Dim j As Integer Dim line As String '①「CSVファイル作成」シートを変数に格納する Set shtMain = ThisWorkbook.Sheets("CSVファイル作成") '②「データ」シートを変数に格納する Set shtData = ThisWorkbook.Sheets("データ") '③区切り文字を変数に格納する If shtMain.Range("A2") = "TAB" Then kugiri = vbTab Else kugiri = shtMain.Range("A2") End If '④くくり文字を変数に格納する kukuri = shtMain.Range("B2") '⑤CSVファイルパスを変数に格納する filePath = shtMain.Range("C2") '⑥「データ」シートの最終行を取得する lastRow = shtData.Cells(shtData.Rows.Count, 1).End(xlUp).Row '⑦「データ」シートの最終列を取得する lastCol = shtData.Cells(1, shtData.Columns.Count).End(xlToLeft).Column '⑧「データ」シートに入力されているデータを配列に格納する varData = shtData.Range(shtData.Cells(1, 1), shtData.Cells(lastRow, lastCol)) Dim st As Object '⑨Streamオブジェクトを生成する Set st = CreateObject("ADODB.Stream") '⑩ファイルタイプにテキスト形式を指定する st.Type = 2 '⑪文字コードにUTF-8を指定する st.Charset = "UTF-8" '⑫Streamオブジェクトを開く st.Open '⑬CSVデータを書き込みする For i = 1 To lastRow line = "" For j = 1 To lastCol line = line & kukuri & varData(i, j) & kukuri If j <> lastCol Then line = line & kugiri End If Next st.WriteText line, 1 Next '⑭CSVデータを指定したファイルに保存する st.SaveToFile filePath, 2 '⑮Streamオブジェクトを閉じる st.Close '⑯Streamオブジェクトを解放する Set st = Nothing MsgBox "完了" End Sub |
4.UTF-8形式のCSVファイルを作成する機能の使い方
それでは、UTF-8形式のCSVファイルを作成する方法を説明します。
まず、「CSVファイル作成」シートのA2セルに「区切り文字」を入力します。
次に、B2セルに「くくり文字」を入力します。
そして、C2セルに作成するCSVファイルのパスを入力します。
次に、「開発」タブの「マクロ」をクリックします。
先程作成した自作関数「MainProc」が一覧に表示されていますので、選択します。
次に、「実行」ボタンをクリックしてCSVファイル作成を開始します。
少し待つと、CSVファイルが作成されます。
それでは、UTF-8形式のCSVファイルの中身を見てみましょう。
各項目は、「”」でくくられ、「,」で区切られています。
次に、区切り文字を「TAB」、くくり文字をなしを指定して、実行してみます。
UTF-8形式のTAB区切りで、くくりなしのファイルが作成されました。
どうですか、簡単でしょ。
もっと大量のデータでも、同じく簡単ですのでやってみてください。
5.CSVファイルを作成するVBAプログラムの説明
それでは、VBAプログラムを説明します。
①「CSVファイル作成」シートを変数に格納する
1 2 |
'①「CSVファイル作成」シートを変数に格納する Set shtMain = ThisWorkbook.Sheets("CSVファイル作成") |
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“CSVファイル作成”)」と入力するより、「shtMain」と入力するほうが少なくてすむからです。
②「データ」シートを変数に格納する
1 2 |
'②「データ」シートを変数に格納する Set shtData = ThisWorkbook.Sheets("データ") |
③区切り文字を変数に格納する
1 2 3 4 5 6 |
'③区切り文字を変数に格納する If shtMain.Range("A2") = "TAB" Then kugiri = vbTab Else kugiri = shtMain.Range("A2") End If |
ただし、入力された文字が「TAB」の場合、VBAプログラムのTAB文字を指定しています。
それ以外の文字が入力されている場合、その文字を変数に格納します。
④くくり文字を変数に格納する
1 2 |
'④くくり文字を変数に格納する kukuri = shtMain.Range("B2") |
⑤CSVファイルパスを変数に格納する
1 2 |
'⑤CSVファイルパスを変数に格納する filePath = shtMain.Range("C2") |
⑥「データ」シートの最終行を取得する
1 2 |
'⑥「データ」シートの最終行を取得する lastRow = shtData.Cells(shtData.Rows.Count, 1).End(xlUp).Row |
「データ」シートの1列目(A列)の値が入力されている最終行を取得します。
A列の最終行(シートに入力可能な最終行)から上に向かって、値が入力されている最初の行を探しています。
⑦「データ」シートの最終列を取得する
1 2 |
'⑦「データ」シートの最終列を取得する lastCol = shtData.Cells(1, shtData.Columns.Count).End(xlToLeft).Column |
「データ」シートの1行目の値が入力されている最終列を取得します。
1行目の最終列(シートに入力可能な最終列)から左に向かって、値が入力されている最初の列を探しています。
⑧「データ」シートに入力されているデータを配列に格納する
1 2 |
'⑧「データ」シートに入力されているデータを配列に格納する varData = shtData.Range(shtData.Cells(1, 1), shtData.Cells(lastRow, lastCol)) |
先程、取得した最終行と最終列を利用して、データの入力範囲を指定しています。
配列にデータを一気に格納しているのは、高速に処理を行うためです。
1セルずつ値を取得するより、配列から取得するほうが早いからです。
⑨Streamオブジェクトを生成する
1 2 3 4 |
Dim st As Object '⑨Streamオブジェクトを生成する Set st = CreateObject("ADODB.Stream") |
⑩ファイルタイプにテキスト形式を指定する
1 2 |
'⑩ファイルタイプにテキスト形式を指定する st.Type = 2 |
また、1を指定した場合、バイナリーファイル形式になります。
⑪文字コードにUTF-8を指定する
1 2 |
'⑪文字コードにUTF-8を指定する st.Charset = "UTF-8" |
⑫Streamオブジェクトを開く
1 2 |
'⑫Streamオブジェクトを開く st.Open |
⑬CSVデータを書き込みする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'⑬CSVデータを書き込みする For i = 1 To lastRow line = "" For j = 1 To lastCol line = line & kukuri & varData(i, j) & kukuri If j <> lastCol Then line = line & kugiri End If Next st.WriteText line, 1 Next |
line変数に格納した文字列をStreamオブジェクトに渡して、書き込みしています。
Streamオブジェクトに渡す2つ目の値として、1を指定してします。
1を指定すると、改行文字を付加してくれます。
つまり、1行ずつ改行するようにStreamオブジェクトに指示しています。
⑭CSVデータを指定したファイルに保存する
1 2 |
'⑭CSVデータを指定したファイルに保存する st.SaveToFile filePath, 2 |
Streamオブジェクトに渡す2つ目の値として、2を指定しています。
この2は、ファイルが存在しなければ作成し、ファイルがすでに存在すれば上書き保存するように指示しています。
1を指定した場合は、ファイルが存在しなければ作成し、ファイルがすでに存在すればエラーとなり上書き保存しないように指示することになります。
⑮Streamオブジェクトを閉じる
1 2 |
'⑮Streamオブジェクトを閉じる st.Close |
使い終わったStreamオブジェクトは閉じるようにしましょう。
⑯Streamオブジェクトを解放する
1 2 |
'⑯Streamオブジェクトを解放する Set st = Nothing |
それでは、好きなデータを「データ」シートに貼り付けして、UTF-8形式のファイルを作成してみましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。