Excel VBA で参照設定をした上で Access.Application を作成し、
DoCmd.TransferSpreadsheet を実行して、xlsx を accdb にインポートする処理を書いています。
この際、基本的に正常動作したのですが、
テーブルでプライマリキー重複するデータをテストしたところ、エラー発生せずに処理を通過してしまいました。
Access VBA 上で同等の処理を行った場合「すべてのデータを追加できませんでした」と言うダイアログが表示されますが、
同じようにダイアログ表示したり、あるいは、エラー発生させたりする方法はありますでしょうか。
質問内容の確認です。以下の認識で宜しいでしょうか。
Access側で作成したVBA(Function)を、Excel側からAccess.Application runで起動を掛けている。
このAccess側のFunctionにDoCmd.TransferSpreadsheet部分があり、エラー発生しているが、現在この内容をExcel側で取得できない。
そのため、Access.Application run実行完了後にその結果を、Excel側で戻り値として取得したい。
Application run ではなく excel 側の vba 内で Acceaa.application のインスタンスを作成する形で、そこから DoCmd.TransferSpreadsheet を実行していますしています。
下記の様な処理をされているのではないかと思われます。
おっしゃる通りエラーは取得できませんでした。
Application runであれば戻り値あるでしょうが、上手いアイディア出ましたらフォローさせて頂きます。
Sub test()
Dim appAccess As New Access.Application
appAccess.OpenCurrentDatabase "C:\Users\Y***\Data.mdb"
Err.Clear
appAccess.DoCmd.TransferSpreadsheet acImport, , "Table", "C:\Users\***\test.xlsx", True
Debug.Print Err.Number
End Sub
予め最低限でもコードを記載いただくと認識の齟齬や不要な確認も無くなり、回答がもらいやすくなると思いますよ。
ありがとうございます。ソースについてはほぼ仰る通りの内容です。
※個別具体的な話としては、インポート元ファイルの行数とインポート先テーブルのビフォーアフターの行数を検証してエラーにするなどの回避をしているのですが、そもそも不可解な挙動であることと、その他のDoCmdのメソッド(使用箇所複数…)等でも同じような事象が発生するのでは無いかとの懸念もあって、継続してこの事象に関する情報を求めています。
なおこれは余談ですがAccess vba を組み込んで Application.run する方式は業務上の都合(溜息)により不可なのです…
DoCmd.TransferSpreadsheetを諦めて、読み込みExcelを起動させてから、
セルを順次読み込みADO(又はDAO)にてAccessへ書き込みする方法もあります。Accessを純粋なデータべベースとして扱う方向です。
(私はExcelからAccessへのデータ書き込みはこの方法を常に取っています。)
回答3件
あなたの回答
tips
プレビュー