この記事では、EXCELにCSVファイルを取込する方法について説明しています。
カンマ区切りで作成されたCSVファイルの各項目のデータ形式を指定さえすれば、取込できます。
データ形式は、日付・文字・整数・小数から選択するだけです。
一度この機能を作成しておけば、次から簡単にCSVファイルを取込できるようになります。
それでは、EXCELにCSVファイルを取込する機能を作成していきましょう。
困っている女性
困っている女性
解決する男性
困っている女性
似たような機能で、EXCELに入力したデータをCSVファイルで出力する機能については、以下の記事を参照してください。
【EXCEL:VBA】入力したデータをCSVファイル形式で出力したい
◆似たような作業で、指定されたフォルダに存在するすべてのCSVファイルを一気に取り込みする方法については、以下の記事を参照してください。
【EXCEL:VBA】フォルダに存在するCSVファイルを全て取り込みたい
CSVファイルを取込する機能に必要なものを、1つ1つ順番に説明していきます。
もくじ
1.取込するCSVファイルのデータ形式を指定するシートを作成する
まず、「取込ファイルパス」、「取込データ形式」を指定する欄を作成します。
「CSV取込」シートを作成する
- 「CSV取込」という名前のシートを作成します。
- 1行目に「取込ファイルパス」のタイトル行を作成します。
- 2行目に「取込ファイルパス」を入力する欄を作成します。
- 3行目に「取込データ形式(日付、文字、整数、小数)」のタイトル行を作成します。
- 4行目に「列No」、「データ形式」のタイトル行を作成します。
- 5行目以降は、「列No」と「データ形式」を入力する欄になります。
「列No」が入力されている行までが、取込データ形式が設定されている行と見なします。
「データ形式」は、日付・文字・整数・小数を入力します。
取込するCSVファイルの各項目のデータ形式を指定します。
2.CSVファイルとして出力したいデータを準備する
それでは、出力したいデータを準備しましょう。
他のEXCELで作成されているデータなら貼り付けましょう。
「データ」シートを作成する
- 「データ」という名前のシートを作成します。
- 中身は特に入力しないでよいです。
このシートは、CSVファイルの中身が書込みされます。
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 86 87 88 89 90 91 92 93 |
Public Sub MainProc() Dim shtMain As Worksheet Dim shtData As Worksheet Dim filePath As String Dim varSet As Variant Dim buf As String Dim arrBuf() As String Dim i As Integer Dim RowNo As Long Dim tmp As Variant Dim maxCol As Integer Dim nowRow As Integer '①「CSV取込」シートを変数に格納する Set shtMain = ThisWorkbook.Sheets("CSV取込") '②「データ」シートを変数に格納する Set shtData = ThisWorkbook.Sheets("データ") '③取込ファイルパスを変数に格納する filePath = shtMain.Range("A2") '④取込データ形式の最終行を取得する nowRow = 4 Do While True If shtMain.Range("A" & nowRow + 1) = "" Then Exit Do nowRow = nowRow + 1 Loop '⑤データ形式を配列に格納する varSet = shtMain.Range("B5:B" & nowRow) '⑥最大列数を取得する maxCol = UBound(varSet) '⑦行番号を初期化する RowNo = 0 '⑧取込ファイルを開く Open filePath For Input As #1 '⑨取込ファイルの最終行まで読込みを繰り返す Do Until EOF(1) '⑩行番号をカウントアップする RowNo = RowNo + 1 '⑪1行読込み、変数に格納する Line Input #1, buf '⑫カンマで区切って、配列に格納する arrBuf = Split(buf, ",") '⑬読込した1行分を1項目ずつシートに書込みする For i = 1 To maxCol Select Case varSet(i, 1) Case "日付" If IsDate(arrBuf(i - 1)) Then tmp = CDate(arrBuf(i - 1)) Else tmp = arrBuf(i - 1) End If Case "整数" If IsNumeric(arrBuf(i - 1)) Then tmp = CLng(arrBuf(i - 1)) Else tmp = arrBuf(i - 1) End If Case "小数" If IsNumeric(arrBuf(i - 1)) Then tmp = CDbl(arrBuf(i - 1)) Else tmp = arrBuf(i - 1) End If Case Else tmp = arrBuf(i - 1) End Select shtData.Cells(RowNo, i) = tmp Next Loop '⑭ファイルを閉じる Close #1 MsgBox "完了" End Sub |
4.CSVファイルを取込する機能の使い方
それでは、CSVファイルを取込する方法を説明します。
取込するCSVファイルを準備する
まず、取込するCSVファイルを準備します。
取込するCSVファイルの中身は、以下のようにカンマ区切りになっています。
取込するCSVファイルの「ファイルパス」と「取込データ形式」を入力する
まず、「CSV取込」シートのA2セルに取込するCSVファイルのパスを入力します。
次に、取込するCSVファイルの各項目のデータ形式をA5セルから入力します。
今回用意したCSVファイルのサンプルは、以下のようになっているので、上の図のようにデータ形式を入力しています。
- 日付 ⇒日付
- 担当者 ⇒文字
- 商品名 ⇒文字
- 単価 ⇒整数
- 数量 ⇒整数
- 金額 ⇒整数
もし、123.45みたいな小数を含むデータの場合は、データ形式を「小数」を指定してください。
マクロを実行する
次に、「開発」タブの「マクロ」をクリックします。
先程作成した自作関数「MainProc」が一覧に表示されていますので、選択します。
次に、「実行」ボタンをクリックしてCSVファイルの取込を開始します。
少し待つと、CSVファイルの取込が完了します。
取込が完了すると、「データ」シートにCSVファイルの中身が書込みされます。
間違いなく「データ形式」を指定していれば、「データ」シートに正しくデータが書込みされます。
どうですか、簡単でしょ。
もっと大量のデータでも、同じく簡単ですのでやってみてください。
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 |
'③取込ファイルパスを変数に格納する filePath = shtMain.Range("A2") |
④取込データ形式の最終行を取得する
1 2 3 4 5 6 7 |
'④取込データ形式の最終行を取得する nowRow = 4 Do While True If shtMain.Range("A" & nowRow + 1) = "" Then Exit Do nowRow = nowRow + 1 Loop |
A列の値が入力されている最終行を探しています。
⑤データ形式を配列に格納する
1 2 |
'⑤データ形式を配列に格納する varSet = shtMain.Range("B5:B" & nowRow) |
⑥最大列数を取得する
1 2 |
'⑥最大列数を取得する maxCol = UBound(varSet) |
⑦行番号を初期化する
1 2 |
'⑦行番号を初期化する RowNo = 0 |
この変数は、いま何行目を取込しているかを判断するのに利用します。
⑧取込ファイルを開く
1 2 |
'⑧取込ファイルを開く Open filePath For Input As #1 |
CSVファイルの中身を取り込みするには、まずファイルを開かないといけないからです。
⑨取込ファイルの最終行まで読込みを繰り返す
1 2 |
'⑨取込ファイルの最終行まで読込みを繰り返す Do Until EOF(1) |
最終行に到達すると、処理を終わらせます。
⑩行番号をカウントアップする
1 2 |
'⑩行番号をカウントアップする RowNo = RowNo + 1 |
こうすることにより、現在何行目を読み込んでいるか判断できるようになるからです。
⑪1行読込み、変数に格納する
1 2 |
'⑪1行読込み、変数に格納する Line Input #1, buf |
⑫カンマで区切って、配列に格納する
1 2 |
'⑫カンマで区切って、配列に格納する arrBuf = Split(buf, ",") |
⑬読込した1行分を1項目ずつシートに書込みする
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 |
'⑬読込した1行分を1項目ずつシートに書込みする For i = 1 To maxCol Select Case varSet(i, 1) Case "日付" If IsDate(arrBuf(i - 1)) Then tmp = CDate(arrBuf(i - 1)) Else tmp = arrBuf(i - 1) End If Case "整数" If IsNumeric(arrBuf(i - 1)) Then tmp = CLng(arrBuf(i - 1)) Else tmp = arrBuf(i - 1) End If Case "小数" If IsNumeric(arrBuf(i - 1)) Then tmp = CDbl(arrBuf(i - 1)) Else tmp = arrBuf(i - 1) End If Case Else tmp = arrBuf(i - 1) End Select shtData.Cells(RowNo, i) = tmp Next |
データ形式に「日付」を指定している場合、日付か確認してから、日付型に変換し変数「tmp」に格納します。
日付でない場合は、取込したままの形式で変数「tmp」に格納します。
データ形式に「整数」を指定している場合、数値か確認してから、整数型に変換し変数「tmp」に格納します。
数値でない場合は、取込したままの形式で変数「tmp」に格納します。
データ形式に「小数」を指定している場合、数値か確認してから、小数型に変換し変数「tmp」に格納します。
数値でない場合は、取込したままの形式で変数「tmp」に格納します。
データ形式に「日付」、「整数」、「小数」以外が指定されている場合、取込したままの形式で変数「tmp」に格納します。
「文字」を指定されている場合も同様です。
そして、変数「tmp」を「データ」シートに書込みしています。
⑭ファイルを閉じる
1 2 |
'⑭ファイルを閉じる Close #1 |
それでは、お好きなCSVファイルを指定して、EXCELに取込してみましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。