● AccessVBA ~ ExcelシートをSQLで部分インポートする方法2つ。既存テーブルへと、新規テーブル作成しながら。
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
★ はじめに
2つあって、
1つめは、既存のテーブルにSQLで絞り込んだレコードを吸い込むもので、
2つめは、既存のテーブルをいったん消して、同名の新規テーブルを作り、
その中に、SQLで絞り込んだレコードを吸い込みます。
一応、両方とも10万件の40列、の内容から数行・数列に絞って処理しました。
(PassMarkのCPUスコアが6000くらいのノートPCでやりました)
6秒くらいかかりました。
20万件だと10秒かからないくらいでした。
★既存のテーブルにSQLで絞り込んだレコードを吸い込むもの
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 |
' ' GPTへの質問内容 AccessにExcelシートを、SQLを使って部分インポートするVBAコードを教えて Option Compare Database Option Explicit Sub ImportExcelToAccess() Dim db As DAO.Database Dim rs As DAO.Recordset Dim strExcelPath As String Dim strSQL As String Dim s_WsName As String Dim s_ConnectStr As String ' Excelファイルのパス ' strExcelPath = "d:\1\10r10c.xlsx" strExcelPath = "d:\1\10man40c.xlsx" '吸い込みたいExcelシート名 s_WsName = "SheetA" ' Accessデータベースの参照を取得 Set db = CurrentDb Let s_ConnectStr = "[Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=" ' ExcelシートからデータをインポートするSQLクエリを作成 ' 「ExcelData」という既存テーブル「f01」、「f02」という列に ' 指定したExcelシートの「f01」、「f02」のレコードを吸い込み。 ' このテストでは「WHERE f01 = 3」のみを。 strSQL = "INSERT INTO ExcelData (f01, f02) " & _ "SELECT f01, f01 " & _ "FROM " & s_ConnectStr & strExcelPath & "].[" & s_WsName & "$] " & _ "WHERE f01 = 3;" ' SQLクエリを実行 db.Execute strSQL, dbFailOnError ' クリーンアップ Set rs = Nothing Set db = Nothing Debug.Print "Data imported successfully!" End Sub ' ' |
★既存のテーブルをいったん消して、同名の新規テーブルを自動で作り、その中に、SQLで絞り込んだレコードを吸い込み
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 |
' ' GPTへの質問内容 AccessにExcelシートを、SQLを使って部分インポートし、かつ、それでテーブル作成までをするVBAコードを教えて Option Compare Database Option Explicit Sub ImportExcelToAccessAndCreateTable() Dim db As DAO.Database Dim strExcelPath As String Dim strSQL As String Dim newTableName As String Dim s_WsName As String Dim s_ConnectStr As String ' Excelファイルのパス ' strExcelPath = "d:\1\10r10c.xlsx" strExcelPath = "d:\1\10man40c.xlsx" '吸い込みたいExcelシート名 s_WsName = "SheetA" ' 新しいテーブルの名前 newTableName = "Exceldata01" ' Accessデータベースの参照を取得 Set db = CurrentDb ' 既存のテーブルを削除(既に存在する場合) On Error Resume Next db.Execute "DROP TABLE " & newTableName, dbFailOnError On Error GoTo 0 Let s_ConnectStr = "[Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=" ' 「Excelシートから吸い込んだレコードで新規テーブルを作成する」 ' というSQLクエリを作成。 ' 指定したテーブル名とフィールド名で作った新規テーブルに、 ' ExcelシートのSQLで絞り込んだ部分を吸い込みます。 ' このテストでは、「Exceldata01」という新規テーブルを作り、 ' その中に、「f01」、「f02」、「f03」、「f04」、というフィールドも作り、 ' 指定したExcelシートの ' 「f01」、「f02」、「f03」、「f04」、のレコードを吸い込み。 ' 「WHERE f01 BETWEEN 3 AND 8」の部分のみを。 strSQL = "SELECT f01, f02, f03 , f04 " & _ "INTO " & newTableName & " " & _ "FROM " & s_ConnectStr & strExcelPath & "].[" & s_WsName & "$] " & _ "WHERE f01 BETWEEN 3 AND 8;" ' SQLクエリを実行して新しいテーブルを作成 db.Execute strSQL, dbFailOnError ' db.Execute strSQL ' クリーンアップ Set db = Nothing Application.RefreshDatabaseWindow 'データベースウィンドウに反映表示。 Debug.Print "Table created and data imported successfully!" End Sub ' ' |