2

Excel で定期的に 25,000 ~ 35,000 行を Access データベースに移動するマクロを作成しようとしています。私が理解しているように、マクロを使用している人々が異なるバージョンの Excel と Access を使用している環境で作業している場合 (私はたまたま 2007 を使用しています)、遅延バインディングを使用することをお勧めします。異なる参照の問題を回避できるからです。およびバージョンなど。- 機能すると、機能します (遅くなりますが)。

次のコードを Excel VBA で動作させようとしています。

Sub TransferToDB()
Dim acApp As Object

ssheet = "C:\Documents and Settings\yk\Desktop\Open Invoice Summary 322 - 2012-07-17.xlsx"
ssrange = "AllData!A1:M28323"

Set acApp = CreateObject("Access.Application")
    acApp.OpenCurrentDatabase ("C:\Documents and Settings\yk\Desktop\Open Invoice Summary.accdb")
    acApp.Visible = True
    acApp.UserControl = True
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, OpenInvoices, ssheet, True, ssrange
    acApp.CloseCurrentDatabase
    acApp.Quit
Set acApp = Nothing


End Sub

マクロが DoCmd.TransferSpreadsheet 行に到達すると、エラーで停止します。

実行時エラー 424:

必要なオブジェクト

Excel のこのルーチンは、大きなブックの多くのワークシートから情報を収集する別のルーチンから呼び出され、そのブックの「AllData」というシートにすべてをダンプします。この DoCmd.TransferSpreadsheet メソッドへの参照をオンラインで見続けていますが、機能するカット アンド ペースト コードを見つけることができないようです...

  1. その時点でルーチンがクラッシュし続けるのはなぜですか?
  2. ADO や DAO を使用せずに Excel から Access に日付を転送することはできますか?
  3. レイト バインディングで問題が発生しないというのは本当ですか、それとも ADO を使用した方がよいのでしょうか?

ありがとう - あなたの助けに感謝します!

4

3 に答える 3

3

これは少し明白に感じますが、エラー メッセージの実際の原因は次のとおりだと思います。

DoCmd はオブジェクトです。これはヘルプ ファイルの Exact です。Application.DoCmd Property

DoCmd プロパティを使用して、読み取り専用の DoCmd オブジェクトとその関連メソッドにアクセスできます。読み取り専用 DoCmd。構文

式.DoCmd

式Application オブジェクトを表す変数です。

言い換えれば、acApp.DoCmdただの代わりに使用する必要がありますDoCmdDoCmdそれ以外の場合、コードはExcel の一部ではないため、その意味を知る方法がありません。

他の質問にも今すぐ対応します。

  1. Docmd.TransferSpreadSheet がどのように実装されているかはわかりませんが、ユーザーの関与なしに DAO または ADO を使用する可能性があります。

  2. どのユーザーよりも新しいバージョンの Office を使用している場合に、使用されているものとは異なる Office アプリケーションを使用する VBA を使用するソリューションを実装する場合、遅延バインディングが必要になることがよくあります。私の経験では、事前バインディングは 2003 から 2010 へのアップグレードには問題なく機能しますが、変更を行うと元に戻すことはできません。従来の VBA を更新すると、参照が現在の参照に自動的に更新され、バージョンの互換性が失われます。そのため、事前バインディングを使用してユーザーより先に更新する場合は、遅延バインディングに切り替えるか、システムのサポートを停止する必要があります。

于 2012-08-28T18:41:15.217 に答える
2

Access タイプ ライブラリの参照セットがないと、Excel は Access の名前付き定数acImportacSpreadsheetTypeExcel9. TransferSpreadsheet メソッドの名前ではなく、これらの定数の値を使用します。

OpenInvoices がリテラルの Access テーブル名である場合は、引用符を追加します。ただし、OpenInvoices が Access テーブルの名前を保持する変数の名前である場合、引用符は必要ありません。

DoCmd.TransferSpreadsheet 0, 8, "OpenInvoices", ssheet, True, ssrange

あなたの質問の3つの部分に答えるには:

  1. Excel が OpenInvoices という名前の変数を見つけられなかったため、OpenInvoices を引用符で囲まずにクラッシュしたのではないかと考えてTransferSpreadsheetいます。
  2. はい、そうです。あなたのTransferSpreadsheetアプローチは、これらの回答で提案されている改訂で機能するはずだと思います。TransferSpreadsheet ただし、 DAOも使用していると思います。
  3. 遅延バインディングは、特定の種類の問題を防ぐことができます。ただし、名前の代わりにそれぞれの定数の値を使用するか、プロシージャで定数として再定義する必要があります。遅延バインディングと ADO は、私にとって紛らわしい質問です。どちらか一方というわけではありません... ADO を使用するときは、ほとんどの場合、特定の ADO バージョンとの早期バインディングによる展開の問題を回避するために、レイト バインディングを使用します。
于 2012-08-28T18:19:08.083 に答える
0

テーブル名は文字列でなければなりません。

acSpreadsheetTypeExcel9 = 8
acImport = 0
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
    "OpenInvoices", ssheet, True, ssrange
于 2012-08-28T18:18:34.267 に答える