VBAでテーブル名とカラム名を動的に取得する方法

このQ&Aのポイント
  • VBAを使用してMySQLに接続し、データベースのテーブル名とカラム名を動的に取得する方法について教えてください。
  • 質問者はWindows7とエクセル2007を使用しており、MySQL5.1とODBCを利用しています。
  • 具体的には、特定のデータベースからテーブル名を取得し、そのテーブル名を変数や配列に格納し、さらにそれを利用してフィールド名を取得したいと考えています。現在のソースコードでは、show tables from databaseというSQL文を使用してテーブル名を取得していますが、うまく取得できずに困っています。改善策やサンプルコードを教えていただけないでしょうか?
回答を見る
  • ベストアンサー

VBAでテーブル名とカラム名を動的に取得したい。

お世話になります。 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")?とやってみたところ、 データベースに入っている一つのテーブル名だけしか取得できませんでした。 ソースが回りくどい気がする+テーブル名が取得出来ず、 大分煮詰まっています。。。 何かもっとうまい書き方や構文(サンプル)ありましたら教えてください!!!

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答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

その他の回答 (2)

  • MARU4812
  • ベストアンサー率43% (196/452)
回答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

  • カラムの一覧を取得したい

    これまでMySQLを利用していたのですが、諸事情によりPostgreSQLへ 移行することになりました。そんなにMySQLへ依存した作り方をして いなかったので、簡単に考えていたのですが、ちょっと躓いている ことが出てきたのでご質問させて戴きます。 MySQLでは「show tables;」というコマンドを送ることにより、 データベース内のテーブル一覧を取得することが出来ました。 かなり色々調べ回ったところPostgreSQLでは 「select * from pg_stat_user_tables」 というコマンドが、それに相当することがわかりました。 同じように、MySQLでの「show fields from TABLE_NAME;」という 指定したテーブルのカラム一覧を取得するためのコマンドに相当する ものを探しているのですが見つかりません。 どなたかご存知であれば、ご教授下さい。 以上、宜しくお願い致します。

  • Access ADP テーブル 説明欄を取得したい

    大変お世話になります。 Access 2007 ADPファイルにて SQL Server 2005 との接続でのシステムを運用しています。 テーブル情報のフィールド説明欄(Description) の値の一覧を取得したいと思い下記のプログラムを作ってみたのですが、Descriptionの値以外はおおむね取得できるのですが、説明欄のところがすべてエラーになってしまい説明欄の Description の取得ができません。 格納場所か、プロパティの参照の仕方が原因だと思うのですが、解決できません。 テーブルの説明欄(Description)値の参照の仕方をご存じの方がいらっしゃいましたら何卒ご教授いただければと存じます。 よろしくお願いいたします。     Dim Cn As ADODB.Connection     Dim Rs As New ADODB.Recordset     Dim SQL As String     Dim i As Integer          Set Cn = CurrentProject.Connection          SQL = " SELECT dbo.テーブルA.* "     SQL = SQL & " FROM dbo.テーブルA"     Dim MyDB As New ADOX.Catalog     Dim MyTable As ADOX.Table     Dim MyField As ADOX.Column     MyDB.ActiveConnection = CurrentProject.Connection     Set MyTable = MyDB.Tables("テーブルA")          Rs.Open SQL, Cn, adOpenForwardOnly, adLockReadOnly         For i = 0 To Rs.Fields.Count - 1             MsgBox Rs.Fields(i).Name                                     'MsgBox MyTable.Columns(Rs.Fields(j).Name).Properties("Description").Value             MsgBox Rs.Fields(i).Properties("Description").Value             MsgBox Rs.Fields(i).ActualSize             MsgBox Rs.Fields(i).Attributes             'MsgBox Rs.Fields(i).DataFormat             MsgBox Rs.Fields(i).DefinedSize             MsgBox Rs.Fields(i).NumericScale             'MsgBox Rs.Fields(i).OriginalValue             MsgBox Rs.Fields(i).Precision                          'MsgBox Rs.Fields(i).Properties("Description")                                      MsgBox Rs.Fields(i).Status             MsgBox Rs.Fields(i).Type             'MsgBox Rs.Fields(i).UnderlyingValue             MsgBox Rs.Fields(i).Value                  Next     Set MyDB = Nothing     Rs.Close     Set Rs = Nothing     Cn.Close     Set Cn = Nothing     Exit Sub

  • postgreSQLでDB名やテーブル名・フィールドを表示させるSQLコマンド

    MySQLでは show databases; show tables; show fields from テーブル名; でSQLコマンドとしても実行できますが、PostgreSQLで 同じことのできるSQLコマンドはあるのでしょうか?

  • データベースのテーブルやカラム情報の取得

    データベースの定義を取得するSQL文を教えてください。 データベースはAccessとMySQLです。 得たい情報はデータベースにあるテーブルとカラムです。 例えば、テーブルがTblAとTblBがあって、 それぞれに整数型のFld1と文字型のFlb2があるとします。 この定義情報を取得したいのです。 テーブルだけでなくクエリ(ビュー)の定義情報も取得できるでしょうか。

    • ベストアンサー
    • MySQL
  • Excel VBA EOFに関して

    テキストボックスにDateを入力し、SQLServerに接続しSelectの結果をシートに書き込むだけのものなのですが、「BOFとEOFのいずれかがTrueになっているか、または現在のレコードが削除されています」というエラーでさっぱりわかりません。どなたかアドバイスをお願い致します。 -前後省略- stdate = UserForm1.stdate.Value endate = UserForm1.endate.Value strsql = "select ***" strsql = strsql & "from ***" strsql = strsql & "where *** and ***.start_date between '" & stdate & "' and '" & endate & "' " con.Open connectionString Set rs = con.Execute(strsql) Sheets("Data1").Select rs.MoveFirst i = 2 Do Until rs.EOF Cells(i, 1) = rs.Fields(0).Value Cells(i, 2) = rs.Fields(1).Value Cells(i, 3) = rs.Fields(2).Value Cells(i, 4) = rs.Fields(3).Value i = i + 1 rs.MoveNext Loop con.Close Set con = Nothing Exit Sub Err_DBConnectOpen: MsgBox Err.Description If con.State <> ADODB.adStateClosed Then con.Close End If Set con = Nothing End Sub

  • 値が「1」のカラム名を求めたい。

    任意の列の、値が「1」のカラム名を求めるにはどうしたらいいでしょうか? PHP Version 5.1.6 MySQL - 5.0.45 で運用しています。 そもそものテーブルの作り方がおかしいのかも知れませんが、 以下のようになっています。 このテーブルで、IDが「40」の列の値が「1」のカラム名を求めたいのです。 どの様にしたらいいでしょうか? ※カラム名「会員番号110」は実際は整数になっています。 ID  会員番号110  会員番号111  会員番号112  会員番号113  40  1       1       0       1       41  0       1       1       1   $sql ="select * from `member_sub_tbl` where `ID`='$ID'"; $result = mysql_query($sql, $con); //カラムの数を取得する $numFields = mysql_num_fields($result); for($i=0;$i<$numFields;$i++){ $nameFields[] = mysql_field_name($result, $i); } print_r($nameFields); これで、カラム名は全て配列に入るのですが、値が「1」のと限定する方法がわかりません。 ご教授、よろしくお願いいたします。    

    • ベストアンサー
    • PHP
  • ACCESS VBA 2つのテーブルから抽出

    ACCESS VBA初心者です 見よう見まねで作成してみたのですが、デバックになってしまい先に進めません どなたか、どこがどう違うのか教えてください テーブル1とテーブル2の15項目ほどをぶつけて 一致しないレコードを抽出し、その抽出したレコードを既存のテーブル3にコピーをしたいのですが、その方法がわかりません Sub QQ() Dim DB As DAO.Database Set DB = CurrentDb() DB.Execute "DELETE * FROM テーブル3;" Dim strSQL As String strSQL = "INSERT INTO テーブル3 ( AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH, III, JJJ ) " strSQL = strSQL & " SELECT テーブル1.AAA, テーブル1.BBB, テーブル1.CCC, テーブル1.DDD, テーブル1.EEE, テーブル1.FFF, テーブル1.GGG, テーブル1.HHH, テーブル1.III, テーブル1.JJJ, FROM AAA;" DB.Execute strSQL Dim TB_テーブル2 As DAO.Recordset Dim TB_テーブル3 As DAO.Recordset Set TB_テーブル2 = DB.OpenRecordset("Select * from テーブル2;") While TB_テーブル2.EOF = False Debug.Print TB_テーブル2![AAA] Debug.Print TB_テーブル2![BBB] Debug.Print TB_テーブル2![CCC] Debug.Print TB_テーブル2![DDD] Debug.Print TB_テーブル2![EEE] Debug.Print TB_テーブル2![FFF] Debug.Print TB_テーブル2![GGG] Debug.Print TB_テーブル2![HHH] Debug.Print TB_テーブル2![III] Debug.Print TB_テーブル2![JJJ] strSQL = "SELECT テープ3.* FROM テーブル3 " strSQL = strSQL & "WHERE (((テーブル3.AAA)='" & TB_テーブル2![AAA] & "') " ←デバックヵ所 strSQL = strSQL & " AND ((テーブル3.BBB)='" & TB_テーブル2![BBB] & "') " strSQL = strSQL & " AND ((テーブル3.CCC)='" & TB_テーブル2![CCC] & "') " strSQL = strSQL & " AND ((テーブル3.DDD)='" & TB_テーブル2![DDD] & "') " strSQL = strSQL & " AND ((テーブル3.EEE)='" & TB_テーブル2![EEE] & "') " strSQL = strSQL & " AND ((テーブル3.FFF)='" & TB_テーブル2![FFF] & "') " strSQL = strSQL & " AND ((テーブル3.GGG)='" & TB_テーブル2![GGG] & "') " strSQL = strSQL & " AND ((テーブル3.HHH)='" & TB_テーブル2![HHH] & "') " strSQL = strSQL & " AND ((テーブル3.III)='" & TB_テーブル2![III] & "') " strSQL = strSQL & " AND ((テーブル3.JJJ)=" & TB_テーブル2![JJJ] & "));" Set TB_テーブル3 = DB.OpenRecordset(strSQL) Debug.Print "COUNT=" & TB_テーブル3.RecordCount If TB_CCC.RecordCount > 0 Then Debug.Print "削除" TB_テーブル3.Delete Else Debug.Print "追加" TB_テーブル3.AddNew TB_テーブル3![AAA] = TB_テーブル2![AAA] TB_テーブル3![BBB] = TB_テーブル2![BBB] TB_テーブル3.Update End If TB_テーブル3.Close TB_テーブル2.MoveNext Wend TB_テーブル2.Close DB.Close End Sub

  • JAVA+MySQLのテーブルロックについて

    Java + MySQL5(MyISAM)でテーブルをロックする処理をかけようと 試みているのですが、上手くロックが掛からずにエラーになります。 テーブル「AAA」と「BBB」にロック処理を行おうと思います。 Connection con = null; Statement ps = null; String sql = null; Class.forName("com.mysql.jdbc.Driver"); con = (Connection) DriverManager.getConnection(url, user, pass); ps = con.createStatement(); sql = "LOCK TABLES AAA WRITE,BBB WRITE"; int a = ps.executeUpdate(sql); sql = "UPDATE AAA SET ~省略~"; a = ps.executeUpdate(sql); sql = "INSERT INTO BBB SET ~省略~"; a = ps.executeUpdate(sql); sql = "UNLOCKS TABLES"; a = ps.executeUpdate(sql); 上記の記述でどこに誤りがあるのでしょうか? お知恵を拝借できないでしょうか。 宜しくお願い致します。

  • SQLインジェクション時の最小値、最大値以外の取得

    ascii(substring((select min(TABLE_NAME) from information_schema.tables where TABLE_SCHEMA != 'mysql' AND TABLE_SCHEMA != 'information_schema'),2,1))>100; ↑MySQLの場合です。 前回ここで疑問に答えていただいて、このようにすることで、tablesというテーブルから、データベースinformation_schemaとmysql以外のデータベースにあるテーブルを取得できるというのはわかったのですが、上のような記述だとmin(TABLE_NAME)にあるとおり、TABLE_NAMEで並べたときの最小のものしか取得できないんです。。。 min(TABLE_NAME)のminをmaxに変えることで最大のものは取得できますが、その2つ以外のテーブル名を取得する記述(例えば2番目を取得するなど)はあるのでしょうか? データベースの種類はMySQLでなくても良いです。 連続の質問になるのですがよろしくお願いします。。。

  • 【EXCEL VBA】ローカルmdbからデータを取得したい

    (環境)  WindowsXP  Excel2003  Access2003 現在、SQLサーバーからデータを取得しています。 下記のソースです(一部抜粋) Private Const SRC_SQL = "Provider=SQLOLEDB.1;User ID=testid;Password=testpass;Data Source=TEST-DB-1;Initial Catalog=testDB" Private Const TBL_TEST = "TEST.テストテーブル" Public Sub TEST_PRO Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CreateObject("ADODB.Connection") cn.CommandTimeout = 0 cn.Open SRC_SQL strSQL = "SELECT X.*, FROM " & TBL_TEST & " X" strSQL = strSQL & " WHERE X.担当者CD = '" & wNAME & "'" strSQL = strSQL & " AND X.オープン日 >= '" & start_dt & "'" strSQL = strSQL & " AND X.オープン日 < '" & end_dt & "'" strSQL = strSQL & " ORDER BY X.オープン日 ASC" Set rs = CreateObject("ADODB.Recordset") rs.Open strSQL, cn With rs ~~~ End With Set rs = Nothing End Sub これを、SQLサーバーではなく、 C:\TESTACCESS.mdbのテーブル:テストテーブル からデータを取得するように変更したいのですが、 どのようにコーディングすればよろしいでしょうか? よろしくお願いします。

専門家に質問してみよう