
お世話になります。
VBAでMySQLに接続をし、DB操作をするものを作成しています。
・Windows7
・エクセル2007
・MySQL 5.1
・ODBC
そこで、以下のことをしたいと思っています。
(1)ある特定のデータベースの中にあるテーブル名を全取得
(2)そのテーブル名を変数または配列に格納
(3)そのテーブル名をキーに、今度はフィールド名を全取得
私が組んでみた該当のソースの部分は、
Dim aaa As New ADODB.Recordset
strSql = "show tables from testdb;"
Set aaa = con.Execute(strSql) 'conはADODB.connection
Dim j As Integer
For j = 1 To aaa.Fields.Count
MsgBox aaa.Fields(j -1).name
Next
・・・とここまで来ました。
show tables from databaseで、データベースにあるテーブルを取得して、
aaa.Fields(j -1).nameには「Tables_in_testdb」が入ります。
その次に、もう消してしまったので無いのですが、
msgbox aaa.Fields("Tables_in_testdb")?とやってみたところ、
データベースに入っている一つのテーブル名だけしか取得できませんでした。
ソースが回りくどい気がする+テーブル名が取得出来ず、
大分煮詰まっています。。。
何かもっとうまい書き方や構文(サンプル)ありましたら教えてください!!!
No.3ベストアンサー
- 回答日時:
XL2000のコードですけれど、ご参考まで。
SELECT * とかでテーブルからレコードセットを取得して、Fields(i).nameを取得してみたけれど、
重たそうなので更に調べてみると、ADOでもDESCRIBEが使える様です。
(DESCでも良いけれど、降順と紛らわしいので)
ADOの参照設定要です。
Sub test()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim strSQL As String
'XAMPPのMYSQLのデータベースにODBC接続してみた
cn.ConnectionString = "Driver={MySQL ODBC 5.1 Driver};DATABASE=*****;" _
& "PWD=******;PORT=3306;SERVER=localhost;" _
& "STMT=SET NAMES utf8;UID=******"
cn.Open
strSQL = "SHOW TABLES;"
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly
Do Until rs.EOF
Debug.Print rs.Fields(0)
strSQL = "DESCRIBE " & rs.Fields(0) & ";"
rs2.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly
Do Until rs2.EOF
'最後に余分な,がつくのは手抜きです
Debug.Print rs2.Fields(0) & ",";
rs2.MoveNext
Loop
Debug.Print
rs2.Close
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set rs2 = Nothing
cn.Close
Set cn = Nothing
End Sub
参考URL:http://support.microsoft.com/kb/193332/ja
No.2
- 回答日時:
私も Oracle と SQLServer しかやってないけど、
> Do Until aaa.EOF
> MsgBox aaa.Fields(0).Value
> LOOP
ADODB.Recordset は
MoveNext で明示的なカレントレコードの移動が必要な気がする。
(もう、.NET 環境しかないので ADODB の資料は手元に無いわ)

No.1
- 回答日時:
MySQL はわからないのですが、パッと見て気になったところを。
aaa には SHOW TABLES FROM testdb の結果が Recordset として格納されてるんですよね。
ならテーブルの数だけレコード数がありますよね。
なのにそのあとでループしてるのはレコードではなくて、1件目のレコードの列をループしてますよね。
Do Until aaa.EOF
MsgBox aaa.Fields(0).Value
LOOP
とかじゃないの?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
参照設定は2.8と6.0 6.1とどちらにチェッ
その他(Microsoft Office)
-
vba Listviewでのチェックボックスのイベントを教えてください
Excel(エクセル)
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
-
4
VBとアクセスでSQL文に変数を使いたいのですが
Visual Basic(VBA)
-
5
ADO+ODBCでテーブルに接続する時のエラー
MySQL
-
6
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
7
ACCESS VBA レコードセットの参照方法について
その他(データベース)
-
8
Accessでテーブル名やクエリ名一覧の抜き出し
Access(アクセス)
-
9
Access 複数フォームを開き、画面の最上面にしたいフォームをコント
その他(データベース)
-
10
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
11
サブフォームのイベント取得
Visual Basic(VBA)
-
12
実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS DCOUNTの抽出条件について
-
Accessリンクするテーブルが見...
-
データがあれば○○なければのSQL
-
SQLServer→Access インポート
-
Access vbaで重複レコードの削...
-
VBAでテーブル名とカラム名を動...
-
VB.NETでテーブルを作成
-
ACCESSで実行時エラー3008
-
「ご処理進めて頂きますようお...
-
UMLでの例外処理
-
VBAでループ内で使う変数名を可...
-
CloseとDisposeの違い
-
尻毛って処理する?。
-
エクセルVBAで、MsgBox やInput...
-
VBAでCOPYを繰り返すと、処理が...
-
UPS警告音を止めたい
-
エクセルの画面にユーザーフォ...
-
エクセルで、日付を入力すると...
-
アクセスVBA フォームのス...
-
銀行の窓口処理の件で知ってる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS DCOUNTの抽出条件について
-
ACCESS VBAでテーブル内の特定...
-
SQLServer→Access インポート
-
Access vbaで重複レコードの削...
-
データがあれば○○なければのSQL
-
重複した複数のレコードを1レ...
-
Accessで縦と横を入れ替えたい
-
VBAでテーブル名とカラム名を動...
-
ACCESSで実行時エラー3008
-
Accessリンクするテーブルが見...
-
アクセスで連続データをテーブ...
-
Microsoft Access 2010 のvbaを...
-
VB.NETでテーブルを作成
-
【access】複数のフィールドの...
-
DAOでSQLServerに接続し、LeftJ...
-
access追加クエリーでform入力...
-
Access BetweenとLikeの組み合...
-
社員名簿から検索する関数
-
抽出条件でデータ型が一致しま...
-
ACCESSで購入回数を表示する方...
おすすめ情報