VBAでExcelスプレッドシートをラインごとにアクセスにインポートします

StackOverflow https://stackoverflow.com/questions/5310582

質問

私はいくつかのコードをデバッグしています、そしてどこにあるかを見つける必要があります
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つの追加オプション:

  1. テーブルのようにアクセスのスプレッドシートをリンクします。 Access 2007では、「外部データ」ペインに移動し、「Excelスプレッドシートのインポート」を選択します。既存のデータテーブル、新しいデータテーブル、またはExcelファイルへのリンクにインポートする必要があります。次に、アクセステーブルのようにこの新しい「Excel」テーブルを使用します(最後に、パフォーマンスの問題を考慮します)。

  2. 修正してみてください Docmd.TransferSpreadsheet 問題。私はこの方法を数年間使用してきましたが、場合によっては少しトリッキーであるはずです(私はあなたのケースを信じています)。アクセスやExcelバージョンなど、この方法の問題に関する詳細情報を提供する場合は、価値があります。

私が助けてくれたことを願っています。幸運を。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top