みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Excel → Access データをインポート

OS WinXP Pro SP2
Office 2000 SP3


はじめまして。
マクロ(Excel VBA)を記述しているExcelファイル(Xls_Macro.xls)とインポート用データのExcelファイル(Xls_Data.xls)は別々のファイルになっていて、マクロを実行するとExcelファイルとインポート用データのExcelファイルのデータをAccessファイル(Access.mdb)にインポートする仕組みを開発しています。

インポート用データのExcelファイル(Xls_Data.xls)をADOで接続しレコードセットでデータを取得し、Accessファイル(Access.mdb)もADOで接続しレコードセットの「.AddNew」でAccessファイル(Access.mdb)に更新しようと考えています。

この考え方で問題ないのでしょうか!?

もっと簡単な方法があるという方や、何か良い方法をお持ちの方
いらっしゃいましたら、よろしくお願いいたします。

投稿日時 - 2008-01-18 10:30:56

QNo.3690386

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

変更が必要なレコードセット(mdbRes)に対してLockが adLockReadonlyってのは無いでしょう
adLockOptimisticとかadLockPessimisticを使用する必要があると思いますよ

投稿日時 - 2008-01-18 12:43:38

ANo.1

レコードセットとフィールドをそれぞれループすれば良いように思います
rsSrc, rsDestが ExcelとAccessの各レコードセットを表すとすると

基本的には
rsSrc.MoveFirst
rsDest.MoveFirst
do while Not rsSrc.EOF
  rsDest.AddNew
  for n=0 to rsSrc.Fileds.count -1
    rsDest(n).Value = rsSrc(n).Value
  next
  rsDest.Update
  rsSrc.MoveNext
loop
といった具合でしょう

オートナンバータイプのフィールドなどがあるなら データの転記を行っているForループの内部で除外する処理が必要です

投稿日時 - 2008-01-18 10:45:36

お礼

redfox63 様 早速の回答ありがとうございます。

やはり、レコードセットとフィールドをそれぞれループする方法でやってみようと思います。

上記ロジックより実行した場合に、実行時エラー:3251
「<--実行時エラー 3251: アプリケーション定義またはオブジェクト定義のエラーです。」が発生してしまいます。
なぜなのでしょうか!?
mdbRes.の後に選択候補としてAddNewはありました。

以下ロジック

'Excel用レコードセット
Set dbRes = New ADODB.Recordset
dbRes.CursorLocation = adUseClient
dbRes.Open strSQL, cnn, adOpenForwardOnly, dLockReadOnly

'Access MDB用レコードセット
Set mdbRes = New ADODB.Recordset
mdbRes.Open tablename, cnn_Mdb, adOpenForwardOnly,adLockReadOnly

dbRes.MoveFirst
mdbRes.MoveFirst
Do While Not dbRes.EOF
mdbRes.AddNew '<--実行時エラー 3251: アプリケーション定義またはオブジェクト定義のエラーです。
For n = 0 To dbRes.Fields.Count - 1
mdbRes(n).Value = dbRes(n).Value
Next
mdbRes.Update
dbRes.MoveNext
Loop

投稿日時 - 2008-01-18 11:15:12

あなたにオススメの質問