ACCESSのデータをADOで操作したいのですけれども,
ACCESSのテーブル名をリストにする方法がわかりません。
教えてください。お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

どもども 田吾作8です。

←1増えた

前回うそをいいました。
カタログのTable内には、クエリーも含みます。
以下のコードを一度実行してください。

'【機能】:テーブル・クエリーをイミディエイトウィンドウへ出力
'【パラメータ】 DBファイルのフルパス
Sub DebugTables(inDbFileName As String)
Dim strConnect As String
Dim wkCnn As ADODB.Connection
Dim wkCat As ADOX.Catalog
Dim wkTbl As Table

'接続の文字列
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & inDbFileName & ";"

'DBに接続
Set wkCnn = New ADODB.Connection
wkCnn.Open strConnect

'カタログにセット
Set wkCat = New ADOX.Catalog
wkCat.ActiveConnection = wkCnn

'テーブル・クエリーをイミディエイトウィンドウへ出力
For Each wkTbl In wkCat.Tables
Debug.Print wkTbl.Type & " : " & wkTbl.Name
Next wkTbl

PGMEND:
'それぞれ開放
Set wkTbl = Nothing
Set wkCat = Nothing
wkCnn.Close
Set wkCnn = Nothing
End Sub

出力をするとwkTbl.Type には、分類すると4タイプあることがわかると思います。
[View] はクエリーです。
[Table] はテーブルです。
他には [ACCESS TABLE]と[SYSTEM TABLE] が存在します。
これらは、アクセスで開いても普段は出てきませんよね。
しかし、設定すると見えるようになります。
1.DBをアクセスで開く
2.メニューバーの[ツール][オプション]を選択
3.[表示]タブのシステムオブジェクトのチェックをONする
これで見えるようになります。
もしアクセスのアドインを作成したりするようなのであれば、これらを使うかも知れませんが、普通ならば無視しててもいい、システム関係のテーブルです。


知ってると思いますが、あくまで余談で・・・
ADOは大変便利です・・・がっ!、注意点が一つ。
ADOで作成したクエリーはアクセスからは見ることが出来ません。

ADOはあまり使ったことがないようにお見受けしたので、参考までに・・・

でわでわ
    • good
    • 0

さらに 田吾作7です ← もどった。



よくよくソースをみるとAdodc1ってのがあるってことは・・・
[ADO Data Control]を使用してるのかな?

strRecSource にはSQL文が入っていないといけないから、テーブルの一覧をすでに取得していないと、使えないよね。
SQL文って「select * from TableName」って感じだから、このソースを実行する前に、どのテーブルを参照するか決めてなきゃいけないので、たぶんテーブル一覧のルーチンはこのプログラムの前に実行することになると思うんだけど・・・

なので、
strRecSource = inputbox("Access's Table name needed")
から
Adodc1.Refresh
まで、書いてあるけど 質問の意図とちょっとはずれた部分のソースを書いているような気が・・・(ごめんね、責めてるわけじゃないよ)

なので、もし下記の回答が答えになってなかったら、リストを取得し何がしたいのかまで教えてもらえると、的確に答えやすいので、よかったらそれも教えてください。

でわでわ
    • good
    • 0
この回答へのお礼

お返事本当にありがたく思っています。
教えていただいた,DebugTablesの
For Each wkTbl In wkCat.Tables
Debug.Print wkTbl.Type & " : " & wkTbl.Name
Next wkTbl
の部分をリストにしてみました。
私はプログラム初心者で今回ADOなるものに触るのは
これが初めてです。
もちろん,SQLというのは聞いたことはあるのですが,
使ったことさえありません。
親切に教えていただいたにもかかわらず,
理解できなくて申し訳なく思っています。
ところで私が何をしたかったかというと,
ADOを触るためにおっしゃった通り,
[ADO Data Control]を使いました。
そして,ADOコントロールを使うために設定せよと,
参考書に書いていた通りに
connectionStringとRecordSourceを設定しようとしました。
しかし,connectionStringは下に書いた通り,コモンダイアログを
利用して,Accessファイルを指定できるのですが,
その中のテーブル名を指定できず困っていました。

一応,内容はそこそこ理解できたのですが,まだまだですので
また,頼らせてください。
重ね重ねありがとうございました。

お礼日時:2001/07/06 16:12

ども 田吾作7です。


ADOでの接続ですよね?なんか、先にアドバイスされてる方がDAOでの接続の場合を説明しているみたいなので、ちょっとカキコしますね。

現在「Microsoft ActiveX Data Object 2.x Library」を参照設定してますね?
「Microsoft ADO Ext. 2.x DDL and Security」は参照設定してますか?してなかったら、参照設定に追加してください。

Dim wkCnn As ADODB.Connection
Dim wkCat As ADOX.Catalog

’まずADOでDBに接続する
wkCnn.Open 接続の文字列

’カタログにセット
Set wkCat = New ADOX.Catalog
wkCat.ActiveConnection = wkCnn


wkCatをデバッグしてください。"TABLE"と"VIEW"というのがあります。
それがテーブル一覧、クエリー一覧に該当します。

でわでわ・・・
    • good
    • 0
この回答へのお礼

お返事ありがとうございました。
ご指摘の通り「Microsoft ADO Ext. 2.x DDL and Security」は
参照設定していませんでした。
そして参照設定すると,
Dim wkCat As ADOX.Catalog
が入力できるようになりました。
が, まだわかりません。
Dim strRecSource as string

strRecSource = inputbox("Access's Table name needed")
Adodc1.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & PathName
Adodc1.RecordSource = strRecSource
Adodc1.Refresh
なんて,していたのですが,これをどうすればよいのでしょうか
Dim wkCnn as adodb.connection
Dim WkCat as ADOX.Catalog

Set wkCnn = New ADODB.Connection
wkCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & PathName
Set wkCat = New ADOX.Catalog
wkCat.ActiveConnection = wkCnn
Label.Caption = wkCat.Tables(2).Name
なんてしてみてlabelを見てみると
「MSysACEs」なんて出てきます。
ヒントをもう少しいただけないでしょうか。

お礼日時:2001/07/05 21:53

(時間が経ってしまっていますが、、、)



DatabaseオブジェクトのTableDefsコレクションのnameプロパティを
使うとAccessファイル中のテーブル名が返ってくるのではないでしょうか?

[db]をデータベースとして、[db.TableDefs(i).name]
をi=0から[db.TableDefs.count-1]まで繰り返して見ていけば
リストにする事も可能かと思います。

もしくは、、、
[MSysObjects]テーブルを見れば、他のオブジェクトと一緒に
テーブルも見えるはずです。これはシステムオブジェクトなので
[ツール][オプション]の[システムオブジェクト]にチェックを
入れると表示されるはず。
    • good
    • 0
この回答へのお礼

お返事ありがとうございました。
お礼の返事が遅れてすいません。

-boya-さんが言われているとおりしてみたのですが,
db.TableDefs(i).name
は実行されませんでした。

ADOとDAOの違いもわからない私なのですが,
時間を割いてくださりありがとうございました。

お礼日時:2001/07/05 21:03

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA ACCESS 更新 追加 find ADO テーブル

いつもお世話になっております。
ACCESSのフォームに作成したコマンドボタンを実行すると
元テーブルから対象テーブルへIDを元に値を更新するようなプログラムを
作りたいと思います。
また、注意点として元テーブルでは「ID」、対象テーブルでは「管理番号」の異なる名称によりデータの管理を行っております。
アドバイスお願いします。
VBAの中でADO関数やFind関数を使ったら出来ると考えております。

Aベストアンサー

関係ないかもしれませんが、前の質問は解決していますか? 自分がした質問をちゃんとファローしておかないと、まともに回答してくれる人が減りますよ。 
http://oshiete1.goo.ne.jp/qa4804510.html

さて、ご質問の件ですが、これは追加クエリで行うことができます。 
クエリというのはSQL処理ですのでADOから、発行することもできます。

クエリを使わないでやる場合は、
1.元テーブルを開きレコードを一件ずつ参照し、
2.そのIDのレコードが、対象テーブルにあるかどうか調べ、
3.ない場合は新規レコードを作成する。
ということになります。

前回のコードを改造すると(未検証ですが)、
Dim CN As New ADODB.Connection
Dim rsA As New ADODB.Recordset
Dim rsB As New ADODB.Recordset
Set CN = CurrentProject.Connection
rsA.Open "元テーブル", CN, adOpenKeyset, adLockOptimistic
rsB.Open "対象テーブル", CN, adOpenKeyset, adLockOptimistic
Do Until rsA.EOF
rsB.Filter = " 管理番号 = '" & rsA!ID & "'"
if rsB.EOF then
rsB.addnew
rsB!管理番号 = rsA!ID
rsB!名前 = rsA!名前
rsB!価格 = rsA!価格
rsB.Update
End if
rsA.MoveNext
Loop
rsB.Close: Set rsB = Nothing
rsA.Close: Set rsA = Nothing
CN.Close: Set CN = Nothing
のような感じになると思います。

これが、クエリ(SQL)で処理すると、
Dim CN As New ADODB.Connection
Set CN = CurrentProject.Connection
CN.EXECUTE "INSERT INTO 対象テーブル(管理番号,名前,価格) SELECT 元テーブル.ID, 元テーブル.名前, 元テーブル.価格 FROM 元テーブル LEFT JOIN 対象テーブル ON 元テーブル.ID = 対象テーブル.管理番号 WHERE 対象テーブル.管理番号 Is Null"
CN.CLOSE: SET CN = NOTHING
になります。(これまた、未検証です。)
レコード数が多くなってくるとパフォーマンスに大きな差が出てきます。(クエリのほうが有利です。)

関係ないかもしれませんが、前の質問は解決していますか? 自分がした質問をちゃんとファローしておかないと、まともに回答してくれる人が減りますよ。 
http://oshiete1.goo.ne.jp/qa4804510.html

さて、ご質問の件ですが、これは追加クエリで行うことができます。 
クエリというのはSQL処理ですのでADOから、発行することもできます。

クエリを使わないでやる場合は、
1.元テーブルを開きレコードを一件ずつ参照し、
2.そのIDのレコードが、対象テーブルにあるかどうか調べ、
3.ない場合...続きを読む

QACCESS2000 INPUTBOX でテーブル名を入れながらテーブル作成

こんにちは。
ACCESS2000 で、さいきん初心者に毛が生えてきました。
通常 VBA を書くときはマクロでいったん作成してから、都合よく書き直しています。
が、マクロに「テーブル作成」という選択肢がありません。
それでマニュアルを見ながら

CREATE TABLE 0310 (
WHS CHAR(30),
CODE CHAR(30),
NAME CHAR(50),
LOC CHAR(30),
QTY LONG
);

というSQL文を書きました。これで必要なテーブルは得られるのですが、このテーブル名が毎日変わるので(日付です)、VBA のINPUTBOX でテーブル名を入れながら毎日の作業をしたいのです。
ちなみにSQL 文はQUERY として登録し、マクロの「クエリを開く」で実行することだけはできるんですが。
よろしくお願いします。

Aベストアンサー

ボタンでも作ってクリック時のイベントにでも下記を

Dim cn As New ADODB.Connection
Dim strSQL As String
Dim tbnm As String

tbnm = InputBox("日付を入力してください")

Set cn = CurrentProject.Connection
strSQL = ""
strSQL = strSQL & " CREATE TABLE "
strSQL = strSQL & tbnm
strSQL = strSQL & "(WHS CHAR(30),CODE CHAR(30),NAME CHAR(50),LOC CHAR(30),QTY LONG);"
DoCmd.RunSQL strSQL

これでInputBoxに入力された0310などの名前でテーブルを作成できます。
しかしデータベースの定義から見れば同構造であるテーブルが毎日増えていくというのは概念から外れていると思いますが・・。
まぁそれなりの理由はあると思います。しかし#1のs_huskyさんの意見に賛成です。
テーブルを一つ作り日付のフィールドも作っておきそのテーブルにクエリでレコードを追加していく方がベターだと思います。

ボタンでも作ってクリック時のイベントにでも下記を

Dim cn As New ADODB.Connection
Dim strSQL As String
Dim tbnm As String

tbnm = InputBox("日付を入力してください")

Set cn = CurrentProject.Connection
strSQL = ""
strSQL = strSQL & " CREATE TABLE "
strSQL = strSQL & tbnm
strSQL = strSQL & "(WHS CHAR(30),CODE CHAR(30),NAME CHAR(50),LOC CHAR(30),QTY LONG);"
DoCmd.RunSQL strSQL

これでInputBoxに入力された0310などの名前でテーブルを作成できます。
しかしデータベー...続きを読む

QADOをし使用して、Accessのテーブルの中のフィールドを消したいのですが。

タイトル通りなんですけど、
テーブルにあるフィールドを追加、削除したいのですが、
どうしたらいいのか全くお手上げ状態です。
助けてください。

ADOを使用しています。
お願いします。

Aベストアンサー

こんにちは。maruru01です。
テーブルにあるフィールドの追加や削除は、ADOの拡張機能であるADOXを使用します。

まず、ADOと同じように参照設定でライブラリを追加します。
ライブラリ名は「Microsoft ADO Ext.2.5 for DDL and Security」です。(バージョンが2.5でないかも知れません。)
そうしたら、後はADOとだいたい同じで、オブジェクト変数を宣言して、新規オブジェクトへの参照を代入します。

Dim cat As ADOX.Catalog
Dim Tbl As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set Tbl = cat.Tables![テーブル名]

'フィールドの追加
Tbl.Columns.Append "追加フィールド名", adWChar
'フィールドの削除
Tbl.Columns.Delete "削除フィールド名"

Set Tbl = Nothing
Set cat = Nothing

Append、Deleteメソッドの引数など詳しいことは、MSDN Libraryなどで調べて下さい。
では。

こんにちは。maruru01です。
テーブルにあるフィールドの追加や削除は、ADOの拡張機能であるADOXを使用します。

まず、ADOと同じように参照設定でライブラリを追加します。
ライブラリ名は「Microsoft ADO Ext.2.5 for DDL and Security」です。(バージョンが2.5でないかも知れません。)
そうしたら、後はADOとだいたい同じで、オブジェクト変数を宣言して、新規オブジェクトへの参照を代入します。

Dim cat As ADOX.Catalog
Dim Tbl As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnect...続きを読む

QAccessで親テーブルと2つの明細テーブルでできているデータのレポートを作りたい

親テーブルと2つの明細テーブルでできているデータのレポートを作りたいのですが、レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

ウィザードを使って作成するとどうしても以下のようになってしまいます。
(ちなみに親テーブルと明細テーブルは伝票番号でリレーションしています)

↓↓↓↓
伝票番号000001に対して、明細Aテーブル(2レコード)、明細Bテーブル(1レコード)あるとする。
-----------------------------------------------------------
本来は以下のように表示したい

ヘッダーセクション
伝票番号:000001
 親テーブルの情報:xxxxxxx

詳細セクション
 明細Aの情報 01 aaaaaaaa
 明細Aの情報 02 aaaaaaaa
明細Bの情報 11 bbbbbbbb

------------------------------------------------------------
実際は以下のように表示される

ヘッダーセクション
伝票番号:000001
 親テーブルの情報:xxxxxxx

詳細セクション
 明細Aの情報 01 aaaaaaaa 明細Bの情報 11 bbbbbbbb
 明細Aの情報 02 aaaaaaaa 明細Bの情報 11 bbbbbbbb

親テーブルと2つの明細テーブルでできているデータのレポートを作りたいのですが、レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

ウィザードを使って作成するとどうしても以下のようになってしまいます。
(ちなみに親テーブルと明細テーブルは伝票番号でリレーションしています)

↓↓↓↓
伝票番号000001に対して、明細Aテーブル(2レコード)、明細Bテーブル(1レコード)あるとする。
----------------------------------------------...続きを読む

Aベストアンサー

>レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

2つの明細テーブルのデータを表示させる事自体なら、サブフォーム見たくサブレポートを用いれば可能です
ウィザードで作れたかどうかは不明ですが、ベースをウィザードで作りその後デザインで開いてサブレポートで繋げていけば良いと思います

フォームと違ってレポートでの注意点としては
普通に作ると明細Aの情報印字するエリア(サブレーポートA)と明細Bの情報印字するエリア(サブレーポートB)の間に空欄が出来るケースがあります、サブレポートAのエリア幅や高さの調整(コーディングやプロパティー設定など)が必要になります
※フォームならスクロールバーでコト足りるのでしょうが、レポートではスクロールバーなど出すものではありません

そういった調整は複雑になりがちな為、サブレポートがつらなるようなものはあまり作られる事はありません
※ないというわけではない、ここらの制御は想定された制御を記載していく形になる為、想定外が来た場合バグりやすいためあまり用いられないというだけです。
クエリーなどを解しシンプルなレポートにするよう心がける事をおすすめします

・今回のテーブル構成だと、簡単な例としては追加クエリーでワークテーブルに格納し1つの明細テーブルを作り上げ、そのワークテーブルを用いてレポート出力する
・ワークテーブルを持ちいらず行ないたいなら、出きるかどうか不明ですが、クエリーで1つの明細テーブルになるようにSQL文を作成する

質問がAccessバージョンやADPなのかMDBなのか不明ですが
Access2000でのMDBならではの回答です、Accessのバージョンがあがるにつれ機能が豊富になってるので出きるのかもしれませんがAccess2000では以上の回答になります

>レポート機能ではフォーム作成のように、詳細セクションに2つの明細テーブルのデータを表示させることはできますか?

2つの明細テーブルのデータを表示させる事自体なら、サブフォーム見たくサブレポートを用いれば可能です
ウィザードで作れたかどうかは不明ですが、ベースをウィザードで作りその後デザインで開いてサブレポートで繋げていけば良いと思います

フォームと違ってレポートでの注意点としては
普通に作ると明細Aの情報印字するエリア(サブレーポートA)と明細Bの情報印字するエリア...続きを読む

QVBSのデータベース操作ADOにて、レコード削除時エラー

Accessに接続し、値をとってきて変数にセットし、その変数を使って、レコード削除しようとすると、エラーになります。以下、ソース

~初期化、変数宣言などあり ~

Set objAdoRset = WScript.CreateObject "ADODB.Recordset")
strSqlStmt = "SELECT f2 FROM test1 GROUP BY f2 "
objAdoRset.Open strSqlStmt, objAdoCon, OpenStatic
Do While objAdoRset.EOF <> True
StrValue(lngLoop) = objAdoRset"f2")
lngLoop = lngLoop + 1
objAdoRset.MoveNext
Loop
objAdoRset.Close

中略

objAdoCon.Open
strSqlStmt = "DELETE FROM test1 WHERE f2 <> " & StrValue(i)  ★★エラー
objAdoCon.Execute strSqlStmt,,adExecuteNoRecords

変数をSQL文に組み込みたいのですが、どうすればよいのでしょうか?どうか、教えてください。

Accessに接続し、値をとってきて変数にセットし、その変数を使って、レコード削除しようとすると、エラーになります。以下、ソース

~初期化、変数宣言などあり ~

Set objAdoRset = WScript.CreateObject "ADODB.Recordset")
strSqlStmt = "SELECT f2 FROM test1 GROUP BY f2 "
objAdoRset.Open strSqlStmt, objAdoCon, OpenStatic
Do While objAdoRset.EOF <> True
StrValue(lngLoop) = objAdoRset"f2")
lngLoop = lngLoop + 1
ob...続きを読む

Aベストアンサー

実際に試してはいないのですが
& "'" & StrValue(i) & "'"
の様にシングルクォートで囲む文字列にするというのはどうでしょう
あと、";"はつけなくてもいいのでしょうか


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報