3

いくつかのコードをデバッグしていて、
DoCmd.TransferSpreadsheet acImport, , ".....
失敗した場所を見つける必要があるため、行ごとに「手動で」インポートして、失敗した場所を確認することにしました。

私が探しているのは次のようなものだと思います:

mySpreadSheet = ConnectTo(Spreadsheet.xlsx)
while(!mySpreadSheet.EOF)
   get(mySpreadSheet.nextLine)
   SQL("UPDATE MyTable with mySpreadSheet.nextLine")

私は無駄にグーグルを試しました。どんな助けでも大歓迎です!


追加情報:

  • スプレッドシートと Access テーブルの列名は同じです。
  • すべてのデータ型は nvarchar(MAX) です (または Access が呼び出す「メモ」)
  • テーブルは SQL Server 2008 へのリンク テーブルです
4

5 に答える 5

10

データのシート レイアウトが明確に定義されている場合、ADO は適切に機能します (HansUp の回答)。オブジェクトをロードする前に追加の制御が必要な場合は、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
于 2011-03-15T14:49:19.880 に答える
5

スプレッドシートへの 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

切り取られたコードは、first_field と second_field がテキスト データ型であると想定しています。それらが数値の場合は、一重引用符を失います。

私はそれがあなたが尋ねたことを大まかにすると思います。ただし、コードに頼る前に、スプレッドシートが新しいネイティブ Access テーブルに正常にインポートされるかどうかを確認します。(また、その新しいテーブルのデータ型と制約が、リンクされた SQL Server テーブルのものと互換性があるかどうかを確認してください。) それが機能する場合は、スプレッドシートを Management Studio から SQL Server に直接インポートするか、適切なツールを使用してみてください。

于 2011-03-15T14:03:03.833 に答える
0

2つの追加オプション:

  1. 表のようにAccessでスプレッドシートをリンクします。Access 2007で、[外部データ]ペインに移動し、[Excelスプレッドシートのインポート]を選択します。既存のデータテーブル、新しいデータテーブルにインポートするか、Excelファイルにリンクする必要があります。次に、Accessテーブルのようにこの新しい「Excel」テーブルを操作します(最後のケースでは、パフォーマンスの問題に関して)。

  2. 問題を修正してみてくださいDocmd.TransferSpreadsheet。私はこの方法を数年間使用しており、場合によっては少し注意が必要ですが、問題なく機能します(私はあなたの場合を信じています)。AccessやExcelのバージョンなど、この方法の問題に関する詳細情報を提供していただければ、その価値があります。

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

于 2011-03-15T12:38:06.027 に答える
0

トラブルシューティングの目的で、スプレッドシートにリンクしてみて、データシート ビューで表示したときにデータが正しく表示されないなど、発生した問題を確認してください。

于 2011-03-15T20:21:11.290 に答える
0

Excel データをクリップボードにコピーして Access テーブルに貼り付けることもできます。失敗したものはすべて、Access によって「貼り付けエラー」テーブルに書き込まれます。

于 2011-03-15T21:35:04.130 に答える