ACCESS2003のVBAの質問です。

ADOを使って、現在あるテーブルをリストとして表示して
そこから一つのテーブルを選択して
その選択したテーブルを
下記のテーブル名として代入したいです。

Table = "テーブル名"

コードを教えてください。

回答の条件
  • 1人2回まで
  • 登録:2009/11/06 16:04:19
  • 終了:2009/11/13 16:05:03

回答(2件)

id:y123diary No.1

y123diary回答回数3ベストアンサー獲得回数02009/11/07 16:32:26

ポイント35pt

テーブル名の取得にはADOXを使います。

最初にツール、参照設定でMicrosoft ADO Ext. xx for DDL and Securityへの参照設定が必要です。

下のサンプルはinputboxにテーブル一覧を表示し、番号選択で選択されたテーブル名が変数Table

にセットされるというものです。


Public Sub GetTableName()

 Dim CAT As ADOX.Catalog

 Dim TB As ADOX.Table

 Dim TableList() As String

 Dim Buf As String

 Dim i As Long

 Dim Table As String

  Set CAT = New ADOX.Catalog

  CAT.ActiveConnection = CurrentProject.Connection

   For Each TB In CAT.Tables

    If TB.Type = "TABLE" Then

     ReDim Preserve TableList(i)

     TableList(i) = TB.name

     Buf = Buf & i & ":" & TB.name & vbCrLf

     i = i + 1

End If

Next TB

   Table = TableList(Val(InputBox(Buf)))

   Set CAT = Nothing

End Sub

id:rupopon

ありがとうございました。

使ってみます。

2009/11/07 16:55:22
id:frkw2004 No.2

ふるるP回答回数192ベストアンサー獲得回数212009/11/09 14:32:43

ポイント35pt

テーブル名の取得に、システムテーブル(MSysObjects)を使う例です。

実行すると、イミディエイトウィンドウに、自データベース上のテーブル名とそのテーブルのレコード数を表示します。

Sub getRecordCounts()

Dim SQL As String

Dim SQL2 As String

Dim oRec As ADODB.Recordset

Dim oRec2 As ADODB.Recordset

Dim sFN As String

Dim Table As String

SQL = "Select Name from MSysobjects where type = 1"

SQL = SQL & " AND Name not like 'MSys%' "

Set oRec = CurrentProject.Connection.Execute(SQL)

Do Until oRec.EOF

Table = oRec.Fields(0)

SQL2 = "Select Count(*) From " & Table

Set oRec2 = CurrentProject.Connection.Execute(SQL2)

Debug.Print "テーブル名:" & Table & " /レコード数:" & oRec2.Fields(0)

Set oRec2 = Nothing

oRec.MoveNext

Loop

Set oRec = Nothing

End Sub

id:rupopon

ありがとうございました。

活用させていただきます。

2009/11/09 15:11:03
  • id:kn1967
    >現在あるテーブル

    どこにあるテーブル?
    同じMDBファイル内?
    それとも、SQLServerなど他のデータベース内?

    >リストとして表示

    ダイアログを作る所から?
    それともリストボックスの入ったフォームがあるという前提?

    >ADO

    同じMDBファイルの中ならDAOのが断然楽だし、応答も速いけど、ダメなの?
  • id:rupopon
    コメントありがとうございます。

    同じMDBファイル内です。

    できればダイアログを作るところからが良いです。

    他のコード部分がADOで書かれているので
    統一した方がいいかと思いました。
    参考にしたコードは下記URLのものです。

    http://www.nurs.or.jp/~ppoy/access/access/acX015.html

  • id:kn1967
    ダイアログまでとなると、いろいろ面倒だから、途中まで。


    ADOX(参照設定必要)を利用し、ダイアログ(フォーム)を開いた時に、
    リストボックス(TableList)にファイル一覧を出すコード
    'Private Sub Form_Load()
    ' L = ""
    ' Set C = New ADOX.Catalog
    ' C.ActiveConnection = CurrentProject.Connection
    ' For Each T In C.Tables
    ' If T.Type = "TABLE" Then
    ' L = L & "," & T.Name
    ' End If
    ' Next T
    ' Set C = Nothing
    ' Me.TableList.RowSource = Mid(L, 2)
    'End Sub


    各行先頭の'はインデントを残すためだけに書いてあります。
    コメント行はありません。
  • id:HALSPECIAL
    HALSPECIAL 2009/11/06 17:44:32
    ちなみにDAOだとこんな感じです。
    http://b-pcworks.com/acc_tips/tips_078.html


    Sub GetTableNameSample()
      Dim myDB As Database
      Dim myTD As TableDef
       'カレントデータベースを変数に代入する
      Set myDB = CurrentDb
       'データベース内のテーブル名前を表示する
      For Each myTD In myDB.TableDefs
         'テーブル名を表示する
        Debug.Print myTD.Name
      Next
    End Sub


    id:kn1967さんの言うとおり、
    DAOはjet用に最適化されているので、MDBのデータの操作はADOより高速です。
  • id:rupopon
    ありがとうございました。
    参考にさせていただきます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません