
CSVからSQLデータ加工をする方法を2つ、ExcelシートからSQLデータ加工する方法2つ。
合計4つの方法を紹介していく。
VBAでSQLを使えるようにする準備
- VBAエディタ内、上メニューの「ツール」から「参照設定」をひらく
- 「Microsoft ActiveX Data Objects 6.1 Library」にチェックを入れる
これで準備はOK。さっそくSQLを使えるようにしていこう。
CSVからSQLデータ加工し、2次元配列にする方法
Function CSVImportToArray(ByVal csv_full_path As String, _
ByVal sql As String) As Variant
If Dir(csv_full_path) = "" Then Exit Function
Dim file_name As String
Dim folder_path As String
file_name = Dir(csv_full_path)
folder_path = Replace(csv_full_path, file_name, "")
Dim ado_connection As New ADODB.connection
With ado_connection
.Provider = "Microsoft.ACE.OLEDB.16.0"
.Properties("Extended Properties") = "TEXT;HDR=YES;FMT=Delimited"
.Open folder_path
End With
Dim ado_recordset As New ADODB.Recordset
Set ado_recordset = ado_connection.Execute(sql)
If ado_recordset.EOF = True Then
CSVImportToArray = Empty
Else
CSVImportToArray = ado_recordset.GetRows
End If
ado_connection.Close
End Function
このコードはCSVをSQLでデータ加工してから2次元配列として出力するコードだ。
コピペして使ってくれ。
使うときは、つぎのコードを使って出力していこう。
Function CSVDataExtraction() As Variant
Dim csv_full_path As String
Dim sql As String
Dim file_name As String
csv_full_path = Application.GetOpenFilename("CSV(*.csv), *.csv", , "csv")
file_name = Dir(csv_full_path)
sql = "SELECT *" _
& " FROM [" & file_name & "]"
CSVDataExtraction = CSVImportToArray(csv_full_path, sql)
End Function
使いかたとしてはsql変数の内容を変えればOK。
コードの流れはつぎのような感じ。
- データ加工したいCSVファイルを選択する
- SQLを実行する
- 2次元配列として出力される
注意点として、ADOで出力した2次元配列はExcelでいう(行,列)の並びが(列,行)に変わるから2次元配列を使うときは注意しよう。
つぎはCSVをデータ加工して、Excelシートに出力する方法を紹介していく。
CSVからSQLデータ加工し、Excelシートに出力する方法
Sub CSVImportToSheet(ByVal csv_full_path As String, _
ByVal sql As String, ByVal paste_start_range As Range)
If Dir(csv_full_path) = "" Then Exit Sub
Dim file_name As String
Dim folder_path As String
file_name = Dir(csv_full_path)
folder_path = Replace(csv_full_path, file_name, "")
Dim ado_connection As New ADODB.connection
With ado_connection
.Provider = "Microsoft.ACE.OLEDB.16.0"
.Properties("Extended Properties") = "TEXT;HDR=YES;FMT=Delimited"
.Open folder_path
End With
Dim ado_recordset As New ADODB.Recordset
Set ado_recordset = ado_connection.Execute(sql)
paste_start_range.CopyFromRecordset ado_recordset
ado_connection.Close
End Sub
このコードは、CSVからExcelシートに出力するベースコードだ。
使うには、つぎのコードをコピペして使ってくれ。
Sub insertCSVData()
Dim csv_full_path As String
Dim sql As String
Dim file_name As String
csv_full_path = Application.GetOpenFilename("CSV(*.csv), *.csv", , "csv")
file_name = Dir(csv_full_path)
sql = "SELECT *" _
& " FROM [" & file_name & "]"
Call CSVImportToSheet(csv_full_path, sql, Sheet1.Range("A2"))
End Sub
これもsql変数の内容を変えるだけでいい。
コードの流れはつぎのような感じ。
- データ加工したいCSVを選択する
- SQLが実行される
- 指定したシートのRangeを基準にデータがまとめて出力される
ちなみにシート名は、オブジェクト名 + .Nameで設定しておくといい。オブジェクト名にしておくことで、シート名が変わってもコード修正しなくていいからだ。
つぎはExcelシートデータをデータ加工して、2次元配列にしていく方法を紹介していこう。
ExcelシートからSQLデータ加工し、2次元配列にする方法
Function sheetImportToArray(ByVal sql As String) As Variant
Dim db_path As String
db_path = ThisWorkbook.Path & "\" & ThisWorkbook.Name
Dim ado_connection As New ADODB.connection
With ado_connection
.Provider = "Microsoft.ACE.OLEDB.16.0"
.Properties("Extended Properties") = "Excel 12.0"
.Open db_path
End With
Dim ado_recordset As New ADODB.Recordset
Set ado_recordset = ado_connection.Execute(sql)
If ado_recordset.EOF = True Then
SheetImportToArray = Empty
Else
SheetImportToArray = ado_recordset.GetRows
End If
ado_connection.Close
End Function
上記コードがExcelシートをデータ加工して、2次元配列で出力するコードだ。
今回はコードが入ってるExcelを対象にしている。
他のExcelブックを参照したい?それならdb_path変数にExcelブックのフルパスを入れればOKだ。
使うときは、つぎのコードを使って2次元配列を出力してこう。
Function sheetDataExtraction() As Variant
Dim sheet_name As String
Dim sql As String
sheet_name = Sheet1.Name
sql = "SELECT *" _
& " FROM [" & sheet_name & "$]"
sheetDataExtraction = sheetImportToArray(sql)
End Function
コードの流れはつぎのような感じ。
- SQLを実行する
- 2次元配列として出力する
最後は、Excelシートをデータ加工。結果を別シートに出力する方法を紹介していこうか。
ExcelシートからSQLデータ加工し、別シートに出力する方法
Sub sheetImportToSheet(ByVal sql As String, _
ByVal paste_start_range As Range) As Variant
Dim db_path As String
db_path = ThisWorkbook.Path & "\" & ThisWorkbook.Name
Dim ado_connection As New ADODB.connection
With ado_connection
.Provider = "Microsoft.ACE.OLEDB.16.0"
.Properties("Extended Properties") = "Excel 12.0"
.Open db_path
End With
Dim ado_recordset As New ADODB.Recordset
Set ado_recordset = ado_connection.Execute(sql)
paste_start_range.CopyFromRecordset ado_recordset
ado_connection.Close
End Sub
上記コードがExcelシートからデータ加工して、別シートに出力するコードだ。
ちなみに、このコードもdb_path変数を変えれば他のExcelブックでもSQL加工できるから試してみよう。
使うには、つぎのコードをコピペして使ってくれ。
Sub insertSheetData()
Dim sheet_name As String
Dim sql As String
sheet_name = Sheet1.Name
sql = "SELECT *" _
& " FROM [" & sheet_name & "$]"
Call sheetImportToSheet(sql, Sheet1.Range("A2"))
End Sub
コードの流れはつぎのような感じ。
- SQLを実行する
- 指定したシートのRangeを基準にデータをまとめて出力する
ちなみに、LEFT JOIN とかで別シート参照する場合は[]に$をつければOK。
Dim sql As String
sql = "SELECT *" _
& " FROM [" & Sheet1.Name & "$] LEFT JOIN [People_Data$]" _
& " ON [" & Sheet1.Name & "$].username = [People_Data$].name"
まとめ: VBAでも爆速でデータ加工してみよう
- CSVからSQLデータ加工し、2次元配列にする方法
- CSVからSQLデータ加工し、Excelシートに出力する方法
- ExcelシートからSQLデータ加工し、2次元配列にする方法
- ExcelシートからSQLデータ加工し、別シートに出力する方法
正直、VBAだけでデータ加工するのは限界がある。
だから、この4つを効率的に使ってSQLで爆速にデータ加工をしていこう。

