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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

4060閲覧

MS Accessのa.accdb上のVBA関数から、b.accdb上のテーブルをCVSファイルに出力したい

tarou_tabi

総合スコア6

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/09/02 02:42

編集2020/09/02 02:45

前提・実現したいこと

タイトルの通りなのですが、a.accdb上に実装したVBA関数から、同じフォルダ内のb.accdb上の"tmp_tbl"テーブルの内容をCVSファイルに出力しようとすると、「このデータベースを開くことができません。データベースファイルが存在しないか、他のユーザーが排他モードで開いているか、ADPファイルでないことが原因です。」というエラーメッセージが表示されます。

今の方法にこだわりはありません。
a.accdb上のVBA関数でb.accdb上のテーブルの内容をファイル出力したいのですが、どのようにしたら出来ますでしょうか?
ご教示頂けたらと思います。

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

実行時エラー '7866'
このデータベースを開くことができません。データベースファイルが存在しないか、他のユーザーが排他モードで開いているか、ADPファイルでないことが原因です。

該当のソースコード

Dim accessFile As String
Dim acc As Access.Application

accessFile = "\aaa\bbb\ccc\b.accdb"

Set acc = New Access.Application
acc.OpenCurrentDatabase accessFile ←ここでエラー発生
acc.DoCmd.TransferText TransferType:=acExportDelim, tableName:="tmp_tbl", fileName:="\aaa\bbb\ccc\aaa.csv"
acc.Quit

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

Microsoft Office Professional Plus 2016

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

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

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

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

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

guest

回答3

0

結局、a.accdbからb.accdbにアクセスするのは諦め、新たにc.xlsmを準備し、下記のように実装したところ、やりたいことができました。
ご回答くださった皆様、ありがとうございました。

Dim acc As Object
Dim acExportDelim As Integer
Dim acTable As Integer
Dim accessFile as String

acExportDelim = 2
acTable = 0
accessFile = "\aaa\bbb\ccc\b.accdb"

Set acc = CreateObject("Access.Application)
acc.OpenCurrentDatabase accessFile
acc.DoCmd.TransferText TransferType:=acExportDelim,TableName:="tmp_tbl",fileName:="\aaa\bbb\ccc\aaa.csv", HasFieldNames:=True

acc.Quit

投稿2020/09/02 05:10

tarou_tabi

総合スコア6

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

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

0

OpenCurrentDatabase の引数であるExclusiveは既定値は共有モードですから、他の処理で排他モードで開いているという事になります。

特に排他モードで開いていない(リンクテーブルも含め)のなら、b.accdbのオプションの設定で排他モードになっていないか確認してみて下さい。
ファイル → オプション → クライアントの設定 → 詳細設定 → 既定の開くモード

投稿2020/09/02 04:37

編集2020/09/02 04:46
sazi

総合スコア25195

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

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

tarou_tabi

2020/09/02 04:55

ご回答ありがとうございます。 確認しましたが、a.accdb/b.accdbいずれも共有モードになっていました。
guest

0

ベストアンサー

こんにちは。
DoCmd.TransferDatabase を使用して、b.accdbのテーブルリンクを生成すればできると思います。

VBA

1 Dim dataPath Ad String 2 3 dataPath = "b.accdb" 4 5 DoCmd.SetWarnings False 6 DoCmd.TransferDatabase acLink, "Microsoft Access", dataPath, acTable, "tmp_tbl", "tmp_tbl" 7 : 8 'tmp_tblに対する処理 9 : 10 CurrentDb.TableDefs.Delete "tmp_tbl" '使い終わったらリンクを削除

こんな感じで。

投稿2020/09/02 04:27

DreamTheater

総合スコア1095

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

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

tarou_tabi

2020/09/02 04:58

ご回答ありがとうございます。 頂いたソースを実施したところ、b.accdbをmydocumentに置かないといけないようなので、 今回のケースでは使えないのですが、テーブルリンクという物を知らなかったので、勉強になりました。 ありがとうございました!!!
DreamTheater

2020/09/02 05:06

それならdataPathにb.accdbが存在するパスを含めて記述するだけですよ。
tarou_tabi

2020/09/02 05:07

含めると、前にmydocumentのパスが付いてしまったので、固定なのかなと思いました。 何か書き方があるのでしょうか?
tarou_tabi

2020/09/02 05:40

そうなんです。 絶対パスで書いたのですが、ダメでした。 DreamTheater様から頂いたコメントを拝読して、なんとなくですが、先頭がドライブじゃなくて、サーバのパスだからダメなのかなと思いました。 ¥¥xx.xx.xx.xx.¥フォルダ¥フォルダ¥b.accdb みたいになってるので、絶対パスと判断出来ていないのかもです。
DreamTheater

2020/09/02 05:48

他サーバであっても問題ないと思うのですが、、、 エクスプローラーから上記パス指定でb.accdbは開きますよね?
tarou_tabi

2020/09/02 08:14

お返事遅くなりまして申し訳ありません。 開きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問