(祝)東京オリンピック!

(祝)北京オリンピック!

SQL関係

ビッグデータの抽出

ビッグデータの抽出をSQLを使用して抽出するためのプロシージャーで、接続から簡単なSQL文を作成して抽出まで行っています。



  

COPY

  1. Public Sub ExcelConnect()
  2. Const adOpenKeyset = 1
  3. Const adOpenStatic = 3
  4. Const adLockReadOnly = 1
  5.  
  6. Dim dbCon As Object
  7. Dim dbRs As Object
  8. Dim strSQL As String
  9.  
  10. Set dbCon = CreateObject("ADODB.Connection")
  11. Set dbRs = CreateObject("ADODB.Recordset")
  12. dbCon.Provider = "Microsoft.ACE.OLEDB.12.0"
  13. 'HDR YES:シートの1行目をヘッダ列として扱う、NO:1行目から行データとして扱う フィールド名は、F+列番号
  14. 'IMEX 0:エクスポート モード、1:インポート モード、2:リンク モード
  15. dbCon.Properties("Extended Properties") = "Excel 12.0;HDR=NO;IMEX=1"
  16. dbCon.Open ThisWorkbook.FullName
  17.  
  18. strSQL = ""
  19. strSQL = strSQL & "SELECT F1, F2 "
  20. 'Sheet1A2:B1001を対象とする
  21. strSQL = strSQL & " FROM [Sheet1$A2:B1001] " 'Cells(1,1)からシート全体を取得したい場合 [Sheet1$]
  22. strSQL = strSQL & " WHERE F2 > 40000 "
  23. strSQL = strSQL & " ORDER BY F2;"
  24. dbRs.Open strSQL, dbCon, adOpenStatic, adLockReadOnly
  25. 'HDR=YESとした場合、フィールド名をセットする
  26. 'For i = 0 To dbRs.Fields.Count - 1
  27. ' Sheet1.Cells(1, 10 +i).Value = dbRs.Fields(i).Name
  28. 'Next i
  29. Sheet1.Cells(2, 10).CopyFromRecordset dbRs
  30.  
  31. dbRs.Close
  32. Set dbRs = Nothing
  33.  
  34. dbCon.Close
  35. Set dbCon = Nothing
  36.  
  37. End Sub

接続

列ヘッダーを結果セットに読み込み(ヘッダーがあっても HDR = NO を使用)、列データが数値である場合は、IMEX = 1 を使用してクラッシュを回避します。 IMEX = 1 を常に使用することは、混合データ列のデータを取得するより安全な方法です。



  

COPY

  1. Excel 2007以降
  2.  
  3. Xlsx files
  4. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;
  5. Extended Properties="Excel 12.0 Xml;HDR=YES";
  6.  
  7. Treating data as text
  8. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;
  9. Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";
  10.  
  11. Xlsb files
  12. Provider=Microsoft.ACE.OLEDB.12.0;
  13. Data Source=c:\myFolder\myBinaryExcel2007file.xlsb;
  14. Extended Properties="Excel 12.0;HDR=YES";
  15.  
  16. Xlsm files
  17. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsm;
  18. Extended Properties="Excel 12.0 Macro;HDR=YES";

VBScript の使用例

VBScript の使用例です。大部分が定型コードです。スクリプトの前半部分では、いくつか定数を定義し、2 つのオブジェクト( ADODB.Connection と ADODB.Recordset )を作成していることを説明するぐらいでしょう。これらのオブジェクトは、データに接続したり、データ ソースからデータを取得するのに必要です。これらの大部分は、ADOスクリプト内で手を加えないでそのまま使用する定型コードです。注意するのは、"Data Source" の部分のみです。この部分では、使用するワークシートへのパスを指定します。ワークシートへのパスに空白が含まれていたらどうなるでしょう。この場合は、まったく問題がないので、次のようにファイル パス全体を空白なども一緒に記述します。



  

COPY

  1. Const adOpenStatic = 3
  2. Const adLockOptimistic = 3
  3. Const adCmdText = &H0001
  4.  
  5. Set objConnection = CreateObject("ADODB.Connection")
  6. Set objRecordSet = CreateObject("ADODB.Recordset")
  7.  
  8. 'Excel 8.0は古いので下のように修正します。sかし・・・・
  9. ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
  10. "Data Source=C:\Scripts\Test.xls;" & _
  11. "Extended Properties=""Excel 8.0;HDR=Yes;"";"
  12. objConnection.Open ConnectionString
  13.  
  14. objRecordset.Open "Select * FROM [Sheet1$] Where Number = 2", _
  15. objConnection, adOpenStatic, adLockOptimistic, adCmdText
  16.  
  17. Do Until objRecordset.EOF
  18. Wscript.Echo objRecordset.Fields.Item("Name"), _
  19. objRecordset.Fields.Item("Number")
  20. objRecordset.MoveNext
  21. Loop

ACCESSへの接続

「Excel ではなく、Excel へのアクセスに使用される ADO プロバイダを指します。プロバイダを Excel 8.0 のままにしておくことで、すべてがうまくいきます。(https://technet.microsoft.com/ja-jp/library/ee692882.aspx)」と言っているので、下記のようにしない方がいいかも。



  

COPY

  1. objConnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
  2. "Data Source=C:\Scripts\Test.xls;" & _
  3. "Extended Properties=""Excel 12.0;HDR=Yes;"";"

SQL構文の一例

SELECT は、出力する項目のリストアップを記述します。出力項目を シート1 列b シート2 列2 及び シート1 列d の合計、 シート2 列4 の合計を項目名 合計d 合計4 で追加しています。

FROM シート1 LEFT JOIN シート2 ON 列a = 列1 は2つのシートのリーレーションの設定をしています。 シート1 列a シート2 列1 で左の シート1 を中心にして照合して、該当がなくてもすべて表示するというリレーションを作っています。

シートがテーブルだということを表すためにシート名に $ を付加します。また、記述を分かりやすくするために AS を使って別名をつけています。ここでは、 シート1 A シート2 B と別名をつけています。

WHERE でグループ化するために拾い上げる条件を指定します。ここでは、 シート1 列c a であるもので、かつ シート2 列3 b であるものを条件としています。

HAVING は、グループ化後に吊り上げる条件を指定します。ここでは、 シート1 列d の合計が 30 を超え、かつ シート2 列4 の合計が 100 を超えるものを吊り上げます。

ORDER BY は出力の昇順、降順を指定します。ここでは、 シート1 列a の昇順を指定しています。降順は項目の後に DESC を追記します。 A.[列a] DESC; のようにします。昇順を明記する場合は、 A.[列a] ASC; とします。 ASC は省略可能です。



  

COPY

  1. mySQL = "SELECT A.[列b], B.[列2], SUM(A.[列d]) AS 合計d, SUM(B.[列4]) AS 合計4"
  2. mySQL = mySQL & " FROM [シート1$] AS A LEFT JOIN [シート2$] AS B ON A.[列a] = B.[列1]"
  3. mySQL = mySQL & " WHERE (A.[列c])='a' OR B.[列3])='b')"
  4. mySQL = mySQL & " GROUP BY A.[列b], B.[列2]"
  5. mySQL = mySQL & " HAVING (SUM(A.[列d]) > 30 AND SUM(B.[列4]) > 100)"
  6. mySQL = mySQL & " ORDER BY A.[列a];"