VBAでExcelスプレッドシートをラインごとにアクセスにインポートします
-
24-10-2019 - |
質問
私はいくつかのコードをデバッグしています、そしてどこにあるかを見つける必要があります
DoCmd.TransferSpreadsheet acImport, , ".....
失敗したので、「手動で」インポートすることにしました。
私はこのようなことが私が探しているものだと思います:
mySpreadSheet = ConnectTo(Spreadsheet.xlsx)
while(!mySpreadSheet.EOF)
get(mySpreadSheet.nextLine)
SQL("UPDATE MyTable with mySpreadSheet.nextLine")
私はグーグルを試してみませんでした。どんな助けも大歓迎です!
追加情報:
- スプレッドシートとアクセステーブルの列名は同一です。
- すべてのデータ型はnvarchar(max)(またはアクセスが呼び出すように「メモ」)です
- テーブルはSQL Server 2008へのリンクテーブルです
解決
スプレッドシートへのADO接続を作成できます(参照 Excel 2007の接続文字列)、その接続でADOレコードセットを開きます(参照 StackOverFlow:VBAのADODBレコードセットは、Excelフィールドがそうでないときに空であると言います 例えば)。
次に、レコードセット行を移動し、行の値を使用してSQL INSERTステートメントを作成します。
strInsert = "INSERT INTO MyTable (first_field, second_field) VALUES ('" & -
rs2.Field(0).Value & "', '" & rs2.Field(1).Value & "');"
Debug.Print strInsert
CurrentDb.Execute strInsert, dbFailonerror
SnippedのコードはFirst_fieldとSecond_fieldがテキストデータ型であると仮定します。それらが数値の場合、単一の引用を失います。
それはあなたが尋ねたことを大まかにすると思います。ただし、コードに頼る前に、スプレッドシートが新しいネイティブアクセステーブルにきれいにインポートされるかどうかを確認します。 (また、その新しいテーブルのデータ型と制約がリンクされたSQLサーバーテーブルのものと互換性があるかどうかを確認してください。)それが機能する場合は、Spreadsheetを管理スタジオからSQL Serverに直接インポートしてみてください。
他のヒント
ADOは、データの明確に定義されたシートレイアウトがある場合にうまく機能します(Hansup Answer)。オブジェクトをロードする前にコントロールを追加する必要がある場合は、Excelワークブックに接続してから、好きなデータを引き出すことができます。それは本当にあなたが必要とする制御のレベルに依存します。
Public Sub LoadExcelToAccess(xlPath As String)
'uses late binding to open excel workbook and open it line by line
'make reference to Microsoft Excel xx.x Object Model to use native functions, requires early binding however
Dim xlApp As Object 'Excel.Application
Dim xlWrk As Object 'Excel.Workbook
Dim xlSheet As Object 'Excel.Worksheet
Dim i As Long
Dim sql As String
Set xlApp = VBA.CreateObject("Excel.Application")
'toggle visibility for debugging
xlApp.Visible = False
Set xlWrk = xlApp.Workbooks.Open(xlPath)
Set xlSheet = xlWrk.Sheets("Sheet1") 'modify to your perticular sheet
'depends on what your trying to do with the sheet
For i = 1 To 10
'quick and dirty: best to load items into custom class collection, then do processing there
sql = "Insert Into [Temp] (Col1) VALUES (" & xlSheet.Cells(i, 1).Value & ")"
DoCmd.RunSQL sql
Next i
'make sure to dispose of objects
xlWrk.Close
xlApp.Quit
Set xlSheet = Nothing
Set xlWrk = Nothing
Set xlApp = Nothing
End Sub
トラブルシューティングのために、スプレッドシートにリンクして、データシートビューで表示するときに間違って表示するデータなど、遭遇する問題を確認してみてください。
また、Excelデータをクリップボードにコピーしてアクセステーブルに貼り付けるだけです。失敗するものはすべて、アクセスによって「貼り付けエラー」テーブルに書き込まれます。
2つの追加オプション:
テーブルのようにアクセスのスプレッドシートをリンクします。 Access 2007では、「外部データ」ペインに移動し、「Excelスプレッドシートのインポート」を選択します。既存のデータテーブル、新しいデータテーブル、またはExcelファイルへのリンクにインポートする必要があります。次に、アクセステーブルのようにこの新しい「Excel」テーブルを使用します(最後に、パフォーマンスの問題を考慮します)。
修正してみてください
Docmd.TransferSpreadsheet
問題。私はこの方法を数年間使用してきましたが、場合によっては少しトリッキーであるはずです(私はあなたのケースを信じています)。アクセスやExcelバージョンなど、この方法の問題に関する詳細情報を提供する場合は、価値があります。
私が助けてくれたことを願っています。幸運を。