マイクロソフトの表計算ソフトExcel(エクセル)から、SQLを扱う方法についてまとめています。
SQLをエクセルから発行する方法
エクセルからSQLを実行する方法は3つあります。
- Microsoft AccessやMicrosoft SQL Server、Azure SQL DatabaseにSQLを発行する
- ODBCを経由して、その他の形式のデータベースにSQLを発行する
- エクセルの表をデータベースのテーブルと見なして、SQLを発行する
Microsoft AccessやMicrosoft SQL Server、Azure SQL DatabaseにSQLを発行
エクセルと同じMicrosoft系のプロダクトにSQLを発行します。同じ会社の製品なので、親和性も抜群。Excelの機能に、データベース接続用の機能が組み込まれています。
Excel を使用した接続 – Azure SQL Database & SQL Managed Instance | Microsoft Docs
データ接続には、Office2007以降の「外部データ接続」か、「Power Query」(アドイン)を使用します。Excel 2016以降では「Get & Transform」という機能が本体に組み込まれ、リボンメニューから高度なSQLを実行するクエリエディタが利用できるようになってます。
参考)外部データ ソースからデータをインポートする (Power Query) – Excel
SQL Server Expressを使えば、無償でエクセルとSQL Serverの連携環境が構築できます。
【関連記事】
▶SQL Server Expressは無料で使えるけど、大きなデメリットはないの?
また、Microsoft AccessをOracleなどのリレーショナルデータベースと連携させ、AccessをフロントエンドとしてExcelからAccessを経由してOracleにSQLを発行することも可能です。
関連)データベースサーバのフロントエンドとしてAccessを利用する:Tech TIPS – @IT
ODBCを経由して、その他の形式のデータベースにSQLを発行
OracleやMySQLなどにODBCを経由してExcelからアクセスすることが可能です。
Microsoft Queryを使うと、ExcelからデータべースへのSQL発行が容易になります。
Access、ODBC for ORACLE、SQL Server、各種データベースのODBCへの接続が可能になります。
関連)WindowsでExcelと外部データベースとを連携させる:Tech TIPS – @IT
接続先のデータベースの更新状況を気にせずにSQLを発行できるんですね。Microsoft Queryのデメリットとしては、vbaスクリプトなどでクエリを動的に組立てることができない(クエリエディタで事前に作成したSQLのみ利用可能)という点があります。
ただし、複雑なクエリを処理する場合、実行スピードが遅くなります。Windows用のネイティブドライバが用意されている場合は、ODBCよりも速度改善が期待できます。
エクセルの表をデータベースのテーブルと見なして、SQLを発行
ADO接続によって、エクセルの表をテーブルとみなしてSQLで扱えるようになります。
参考)ADOを使ってExcelをテーブルとして読み込む方法について | INFITH VBA Lab
ADOとは、ActiveX Data Objectsの略で、Microsoftが定めた仕様に沿って統一されたオブジェクト。統一された手順でアクセスが可能になります。
ADOを使えば、データベースもエクセルの表も、テキストファイルでさえも、同じような手順でアクセスできるようになるんですね。
vbaからアクセスする場合に使われます。
ADO接続の際、以下のように記述することで、Excelのテーブルに対してクエリを発行できます。
oRS.Open "Select * from [Sheet1$]", oConn, adOpenStatic
以下のサンプルは、ADO接続で取得したデータをワークシートにインポートします。ADO接続では、取得したデータに数式やフォーマットを適用することができません。元々の設定が上書きされてしまうんですね。そのため、FormatProductsWorksheetにて、取得したデータに対してフォーマット処理を行っています。
Private Sub Workbook_Open() 'If there's a Products worksheet present in the workbook, format it. 'Then delete the first sheet in the workbook Dim oSheet As Worksheet For Each oSheet In ThisWorkbook.Worksheets If oSheet.Name = "Products" Then FormatProductsWorksheet Application.DisplayAlerts = False ThisWorkbook.Worksheets("Sheet1").Delete DeleteCode Exit For End If Next End Sub Private Sub FormatProductsWorksheet() Dim oSheet As Worksheet, oHdr As Range, nRows As Long Set oSheet = ThisWorkbook.Worksheets("Products") With oSheet nRows = .UsedRange.Rows.Count .Range("A1").ColumnWidth = 30 .Range("B1").ColumnWidth = 15 .Range("C1").ColumnWidth = 15 .Range("B2").Resize(nRows - 1).NumberFormat = "0.00" .Range("C2").Resize(nRows - 1).NumberFormat = "[Red][<20]0;0" .Range("D2").Resize(nRows - 1).Formula = "=B2*C2" .Range("D2").Resize(nRows - 1).NumberFormat = "0.00" Set oHdr = .Range("A1:D1") oHdr.Value = Array("Product", "Unit Price", "In Stock", "Value") oHdr.Font.Bold = True oHdr.Borders(xlEdgeBottom).Weight = xlThin .UsedRange.AutoFilter .Cells(nRows + 2, 4).Formula = "=SUBTOTAL(9,D2:D" & nRows & ")" .Cells(nRows + 2, 4).NumberFormat = "0.00" .Cells(nRows + 2, 3).Value = "SubTotal:" End With End Sub Private Sub DeleteCode() 'Delete the code in this module. Dim iLines As Integer iLines = ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.CountOfLines ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.DeleteLines 1, iLines End Sub
参考)ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)
まとめ
- Microsoft系のSQL Server等には、エクセルの標準機能でSQL発行可能
- 一般のDBにアクセスするには、ODBCを利用する
- VBAから、エクセルの表をテーブルとみなしてSQL発行も可能