質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%

Q&A

解決済

2回答

8139閲覧

Excel VBAでmdbのテーブルを別mdbへコピーしたい

sabimoto

総合スコア8

0グッド

0クリップ

投稿2018/01/27 07:36

前提・実現したいこと

サーバー上にあるmdbファイルのAテーブルの内容を、ローカルフォルダの同名mdbの同名Aテーブルに丸々コピーしたい。
ツールはExcel VBAでAccessにADOで接続します。

複数のmdbへの接続ができればよいのですが、できなさそうなので下記のような方法で実装しました。

【動作概要】
①サーバーmdbのAテーブルの内容を一旦変数へ格納し接続を切断E
②ローカルmdbへ接続しAテーブルの内容をクリア
③変数からAテーブルへINSERT実行

発生している問題・エラーメッセージ

エラー無く実行できるのですが、mdbを開いて確認すると、
上記②の操作までは反映されているのですが、③の操作が反映されていません。

SQL文も問題無さそう(ほかのモジュールでは動いていたものを流用)なので、mdbの接続を切り替える方法などに
何か問題があるのではと思っています。

該当のソースコード

Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成
Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成

'サーバーMDBへ接続
adoCn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & AccessFilePath & ";Jet OLEDB:Database Password=" & DBPWD & ";" 'Accessファイル(~2003)を開く
'adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBpath & ";" 'Accessファイル(2007~)を開く

'全データの取得 AccessSQL = "SELECT 番号2,説明2,機器コード2,機器名2,期限2,対策2,コード2 FROM " & G_AccessTableName_Masta & "" 'SQL実行 adoRs.Open AccessSQL, adoCn, adoOpenDynamic Do Until adoRs.EOF = True RecordMaxCount = RecordMaxCount + 1 adoRs.MoveNext Loop '初期化 If adoRs.BOF <> True Then adoRs.MoveFirst ReDim tempDBRecord(RecordMaxCount, 7) As String Do Until adoRs.EOF = True tempDBRecord(j, 1) = adoRs!番号2 tempDBRecord(j, 2) = adoRs!説明2 tempDBRecord(j, 3) = adoRs!機器コード2 tempDBRecord(j, 4) = adoRs!機器名2 tempDBRecord(j, 5) = adoRs!期限2 tempDBRecord(j, 6) = adoRs!対策2 tempDBRecord(j, 7) = adoRs!コード2 adoRs.MoveNext j = j + 1 Loop adoCn.Close adoRs.Close Set adoRs = Nothing 'オブジェクトの破棄 Set adoCn = Nothing Set adoCn2 = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成 Set adoRs2 = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成 'ローカルMDBへ接続 AccessLocalPath = G_AccessFile_LocalPath & G_AccessFile_LocalName adoCn2.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & AccessLocalPath & ";Jet OLEDB:Database Password=" & DBPWD & ";" 'Accessファイル(~2003)を開く 'サーバーMDBから取得した情報をローカルMDBへ書き込み 'コピー前に一覧をクリアする AccessSQL = "DELETE FROM " & G_AccessTableName_Masta & "" adoCn2.Execute AccessSQL 'コピー処理開始 j = 1 '初期化 Do Until j = RecordMaxCount AccessSQL = _ "INSERT INTO " & G_AccessTableName_Masta & "(番号2,説明2,機器コード2,機器名2,期限2,対策2,コード2) " _ & "VALUES('" & tempDBRecord(j, 1) & "','" & tempDBRecord(j, 2) & "','" & tempDBRecord(j, 3) & "','" & tempDBRecord(j, 4) & "'," _ & "#" & tempDBRecord(j, 5) & "#,'" & tempDBRecord(j, 6) & "','" & tempDBRecord(j, 7) & "')" adoCn2.Execute AccessSQL 'Debug.Print AccessSQL j = j + 1 Loop adoRs2.Close 'レコードセットのクローズ adoCn2.Close

試したこと

オブジェクトを別名で用意したりしましたが一向に反映されません。

補足情報(FW/ツールのバージョンなど)

Excel 2007、Access 2007を使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/01/28 06:11

コードは見にくいので ``` で囲って下さい。
sabimoto

2018/01/28 13:10

すみません。どういう意味だかわかりません。
guest

回答2

0

'" & tempDBRecord(j, 6) & "' ←はBoolean値を入力するフィールドなので、

" & tempDBRecord(j, 6) & " ←こうするのが正解でした。

投稿2018/01/28 13:15

sabimoto

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

コピーする際にNull考慮されていませんが、コピー元データにNullは存在しないのでしょうか?

Debug.Print AccessSQLの結果をローカルのMDBで直接実行すると追加されるでしょうか?

投稿2018/01/28 06:09

編集2018/01/28 06:09
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sabimoto

2018/01/28 13:12

Nullは事前にカットしています。 MDBで実行する方法を知らなかったので調べながらやってみると型変換エラーが出てしまい、 よくよくみてみると、tempDBRecord(j, 6) = adoRs!対策2 と代入していたところは文字列ではなく Bool型の値を入力する箱だったので、SQL時に’でくくってしまっていたのが原因だったようです。 おかげ様でなんとか先に進めました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問