Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


257 / 2272 ツリー ←次へ | 前へ→

【12342】別ファイルのテーブルを別ファイルに転送 jakosan 13/6/21(金) 21:21 質問[未読]
【12343】Re:別ファイルのテーブルを別ファイルに転送 hatena 13/6/21(金) 23:04 回答[未読]
【12344】Re:別ファイルのテーブルを別ファイルに転送 jakosan 13/6/22(土) 10:20 質問[未読]
【12345】Re:別ファイルのテーブルを別ファイルに転送 hatena 13/6/23(日) 16:19 回答[未読]
【12346】Re:別ファイルのテーブルを別ファイルに転送 hatena 13/6/23(日) 16:34 回答[未読]
【12357】Re:別ファイルのテーブルを別ファイルに転送 hatena 13/6/24(月) 21:57 回答[未読]
【12362】Re:別ファイルのテーブルを別ファイルに転送 situmonsya 13/6/30(日) 9:51 お礼[未読]
【12379】Re:別ファイルのテーブルを別ファイルに転送 hatena 13/7/6(土) 21:00 回答[未読]

【12342】別ファイルのテーブルを別ファイルに転送
質問  jakosan  - 13/6/21(金) 21:21 -

引用なし
パスワード
   A.mdbというファイルのモジュールにtensou()という関数を書いたファイルを開いている状態で、B.mdbにあるbbbというテーブルをC.mdbに転送するVBAコートはつくれないでしょうか。
B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です。
APIを使うなどの高度なテクニックを使うのでもいいです。
A.mdbにB.mdbのbbbテーブルへのリンクテーブルをつくって、それをC.mdbに転送するコードをつくったら、C.mdbにB.mdbのbbbテーブルへのリンクテーブルが作られて失敗しました。
その失敗事例は過去ログにのっていましたが成功事例は見つかりませんでした。
いい方法はないとあきらめるべきでしょうか。

【12343】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/21(金) 23:04 -

引用なし
パスワード
   ▼jakosan さん:
>A.mdbというファイルのモジュールにtensou()という関数を書いたファイルを開いている状態で、B.mdbにあるbbbというテーブルをC.mdbに転送するVBAコートはつくれないでしょうか。
>B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です

B.mdbとC.mdbは、C:\Test にあるとして、

Public Sub tensou()
  Dim appAccess As Access.Application
  
  Set appAccess = CreateObject("Access.Application")
  appAccess.OpenCurrentDatabase "C:\Test\C.MDB"
  appAccess.DoCmd.TransferDatabase acImport, "Microsoft Access", _
  "C:\Test\B.MDB", acTable, "bbb", "bbb"
  
  appAccess.Quit
  Set appAccess = Nothing

End Sub

【12344】Re:別ファイルのテーブルを別ファイルに...
質問  jakosan  - 13/6/22(土) 10:20 -

引用なし
パスワード
   ▼hatena さん:
>  appAccess.OpenCurrentDatabase "C:\Test\C.MDB"
>  …
>  "C:\Test\B.MDB", acTable, "bbb", "bbb"
というコードは
>>B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です
という条件に反するので申し訳ないですがNGです。
それとこの方法だとたまにハングアップすることがあります。
ほかにいい方法ってないでしょうか。

【12345】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/23(日) 16:19 -

引用なし
パスワード
   ▼jakosan さん:
>>>B.mdbとC.mdbは開かないで、A.mdbもモジュールだけでやるという条件です
>という条件に反するので申し訳ないですがNGです。
>それとこの方法だとたまにハングアップすることがあります。

OpenCurrentDatabase ではダメということですか。

なら、
リンクテーブルを作成して、それをテーブル作成クエリで外部MDBにテーブルを作成する、
ではどうですか。


Public Sub tensou()

  DoCmd.TransferDatabase acLink, "Microsoft Access", _
  "C:\Test\B.MDB", acTable, "bbb", "bbb"

  CurrentDb.Execute _
  "SELECT bbb.* INTO bbb IN 'C:\Test\C.Accdb' FROM bbb;"

  DoCmd.DeleteObject acTable, "bbb"


End Sub

すでにテーブルが存在するときなどのエラー処理は適宜追加してください。

【12346】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/23(日) 16:34 -

引用なし
パスワード
   リンクテーブルにしなくても、ソース側もIN句で外部接続すれば、1回のクエリ実行ですみますね。

Public Sub tensou()

  CurrentDb.Execute _
  "SELECT bbb.* INTO bbb IN 'C:\Test\C.MDB' " & _
  "FROM bbb IN 'C:\Test\B.MDB';"


End Sub

【12357】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/6/24(月) 21:57 -

引用なし
パスワード
   >  CurrentDb.Execute _
>  "SELECT bbb.* INTO bbb IN 'C:\Test\C.MDB' " & _
>  "FROM bbb IN 'C:\Test\B.MDB';"

転送先に既にテーブルが存在するときは、エラーになりますので、その場合も実行するには、
エラー処理でテーブルを削除する必要があります。
DROP TABLE では IN句が使えないようなので、OpenDatabase を使用しました。

Public Sub tensou1()
  Dim sSQL As String
  Dim db As DAO.Database
  
On Error GoTo E
  
  Set db = OpenDatabase("C:\Test\C.MDB")
  sSQL = "SELECT bbb.* INTO bbb " & _
  "FROM bbb IN 'C:\Test\B.MDB';"
  db.Execute sSQL
  
ExitSub:
  Exit Sub
E:
  Select Case Err
  Case 3010
    db.Execute "DROP TABLE bbb"
    Resume
  Case Else
    MsgBox Err & ":" & Err.Description
    Resume ExitSub
  End Select
End Sub

OpenDatabase も使っちゃあかん、ということなら、DoCmd.RunSQL を使って、下記のような方法もあります。

Public Sub tensou3()
  Dim sSQL As String
  
  sSQL = "SELECT bbb.* INTO bbb IN 'C:\Test\C.MDB' " & _
  "FROM T_Img IN 'C:\Test\B.MDB';"
  
  DoCmd.SetWarnings False
  DoCmd.RunSQL sSQL
  DoCmd.SetWarnings True
End Sub

【12362】Re:別ファイルのテーブルを別ファイルに...
お礼  situmonsya  - 13/6/30(日) 9:51 -

引用なし
パスワード
   最後の方法でうまくいきました。
ありがとうございました。

【12379】Re:別ファイルのテーブルを別ファイルに...
回答  hatena  - 13/7/6(土) 21:00 -

引用なし
パスワード
   ▼situmonsya さん:
>最後の方法でうまくいきました。

その後、別件を調べていて偶然気がついたのですが、
IN句を使って、テーブル作成した場合、主キーやインデックス、値要求の設定が受け継がれません。

それらの設定も受け継がせたいときは、やはり、OpenCurrentDatabase → TransferDatabase でインポートまたはエクスポートする必要があります。

念のために報告しておきます。

257 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078191
(SS)C-BOARD v3.8 is Free