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

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

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

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

Access

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

Q&A

解決済

1回答

2282閲覧

ExcelVBA Access操作 リモートサーバーがないか使用できる状態ではありません

niku_mamushi

総合スコア3

VBA

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

Access

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

0グッド

0クリップ

投稿2023/05/09 07:09

編集2023/05/09 07:14

実現したいこと&前提

ACCESSのバックアップ用に指定したテーブルのCSVを取得
ACCESSはmdbファイルで3つある。エクセルで操作することが前提
参照設定にACCESS16とACCESS databaseengin追加

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

一回目はエラーなく進む。
2回目でエラーになる
"リモートサーバがないか使用できる状態ではありません"

ACCESSを開かずにできるならそうしたいですが
DoCmd.TransferText でACCESSを開いていないと
"コマンドまたはアクション'テキスト変換'は無効です"
なのでしょうがなくcreateobject(access)で開いている。

該当のソースコード

Sub ACCESSkaraCSV()

Set ws_sitei = ThisWorkbook.Worksheets("指定テーブル") Set ACCESSobj = CreateObject("Access.Application") ACCESSobj.OpenCurrentDatabase (mdbpath) ACCESSobj.Visible = True '↓ここで"リモートサーバがないか使用できる状態ではありません" Set DB = currentDb ws_sitei.Range("A2:A" & ws_sitei.Range("A2").Rows.End(xlDown).Row).Name = "指定テーブル" Set r_sitei = ws_sitei.Range("指定テーブル") For i = 1 To r_sitei.Rows.Count 'table_nameに入るテーブル名がCSV排出されます table_name = r_sitei(i) '↓ここで"コマンドまたはアクション'テキスト変換'は無効です" DoCmd.TransferText acExportDelim, , table_name, path & "\" & table_name & ".csv", True Next End If ACCESSobj.Quit Set ACCESSobj = Nothing DB.Close Set DB = Nothing MsgBox "end" End If

End Sub

試したこと

set db = opendatabase(mdbpath)
set db = dbe.opendatabase(mdbpath)
上記に変更しても同じエラー

ACCESSobj.quitに追加で
ACCESSobj.CloseCurrentDatabase
できない

"リモートサーバがないか使用できる状態ではありません"
を調べるとオブジェクトの解放しかでてこないがしてるっぽい
たしかに一回目が終わってリセットボタンを押して2回目だったり
end subではなくendにすると上手くいくので一回目終了後に何か残っているのかもしれませんが、setは開放している。。。

"コマンドまたはアクション'テキスト変換'は無効です"
を調べると'テキスト変換'の部分が違うエラーの物しか出てこない

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

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

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

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

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

guest

回答1

0

ベストアンサー

DoCmd.TransferText acExportDelim, , table_name, path & "" & table_name & ".csv", True

vba

1ACCESSobj.DoCmd.TransferText acExportDelim, , table_name, path & "\" & table_name & ".csv", True

Set DB = currentDb

vba

1Set DB = ACCESSobj.CurrentDb

もっとも、以降のコードにおいて変数 DB を介してデータベース上の
オブジェクトを参照/操作する命令が呼び出されていないため、
ここでの CurrentDb メソッドの呼び出しははっきり言って無駄です。

DB.Close
Set DB = Nothing

上記も同様。

投稿2023/05/09 07:22

sk.exe

総合スコア744

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

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

niku_mamushi

2023/05/09 07:39

ありがとうございます!!解決しました。 確かにDoCmdってこんなんで参照できているのか?とおもったりしたのですごいしっくりです
sk.exe

2023/05/09 07:47 編集

> 一回目はエラーなく進む。 > 2回目でエラーになる ちなみに上記の原因は下記リンク先の記事で示されている通り。 https://support.microsoft.com/ja-jp/topic/2-%E5%9B%9E%E7%9B%AE%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB-excel-%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B-6647c4b4-da5c-ee1f-cc6f-58815d47702d CurrentDb メソッドも DoCmd プロパティも Access.Application オブジェクトのメンバーです。 これらを Access のモジュールではなく Excel のモジュールから呼び出す場合は、その親である Access.Application オブジェクトを参照する変数(ここでは ACCESSobj )で明示的に修飾しなければなりません。
niku_mamushi

2023/05/09 08:01

上記サイトも見てたんですが、いまいち理解できてなかったですがこれを聞いてからだと何となくわかります!ありがとうございます。 ちなみに記述したコードは必要なとこだけだったので accessのtableを全部取得するために For Each obj in DB.TableDef という記述があるんですがACCESSobj.TableDefではできなくて 結局Set DBのとこで2回目以降のエラーメッセージになってしまいます DBを使わない方法はありますでしょうか? 上記サイトや言ってくださってることですと オブジェクト変数で修飾せずに オブジェクト、メソッド、またはプロパティを呼び出すコード行があるため解放されていないとの事ですが、それがどこにあたるのかわかりません。
niku_mamushi

2023/05/09 08:04

すみません set DB = ACCESSobj.currntDb で解決でした。まだまだですね ほんとにありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問