• ベストアンサー

(ADO)フィールド名から取得したい

ADOを使ってエクセルからアクセスのデータを取得しています。 (2003です。) Sub アクセスのデータをエクセルへ() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long Range("a1") = "番号" Range("b1") = "種類" rs.Open "SELECT * FROM Tbl", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount Range("a" & i + 1) = rs("番号") Range("b" & i + 1) = rs("種類") rs.MoveNext Next i End Sub 結果は    A     B 1  番号   種類 2  ××   ○○ となるのですが コート゛の Range("a1") = "番号" Range("b1") = "種類" の部分を省略して テーブルのフィールド名から取得できないでしょうか? 例は2つのフィールドしかないから楽なのですが 実際はTblには30列くらいあるのです。 アクセスのOffice Linksや アクセスからメニュー[ファイル]-[エクスポート]のような結果がほしいです。 どうしてもADOでやりたいので どなたかご教授よろしくお願いします。

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

 現状、お示しのコードでちゃんと動いているのでしたら、 For i = 1 To rs.RecordCount 以下を下記に書き換えてみてください。 Dim j As Long With rs  For i = 1 To .RecordCount   For j = 0 To .Fields.Count - 1    Cells(1, j + 1) = .Fields.Item(j).Name    Cells(i + 1, j + 1) = .Fields.Item(j)   Next j   .MoveNext  Next i End With End Sub

ijuhyg
質問者

お礼

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

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

質問のコードで動きましたか?疑問あり。 出来るだけ完全なものを上げてください。 私の場合でやってみた。db2というmdbがあり、そこに生徒テーブルがあり、氏名と学校フィールドが有る。 第3番目と第5番目のフィールドです。フィールドのINDEXは0から始まる。 質問は何が判っている前提での話か。 順番 名前 >テーブルのフィールド名から取得できないでしょうか フィールド名がわかっているなら、質問のような書き方になるのでは? 言いたいことが、良くわからん。 Sub test04() Const cnsADO_CONNECT1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i As Long MsgBox CurDir cn.Open cnsADO_CONNECT1 & CurDir & "\" & "\db2.mdb;" rs.Open "SELECT * FROM 生徒", cn, adOpenKeyset, adLockOptimistic Range("a1") = rs.Fields(2).Name Range("b1") = rs.Fields(4).Name For i = 1 To rs.RecordCount Range("a" & i + 1) = rs("氏名") Range("b" & i + 1) = rs("学校") rs.MoveNext Next i End Sub ーー A列  B列 氏名 学校 大田黒 南小学校 上野 北小学校 目黒山上 中興小学校 木下 中央小学校 ・・ となったから間違いないでしょう。 ーー エクセル側で参照設定が必要。

ijuhyg
質問者

お礼

すいません。一部端折ってしまいました。 ありがとうございます。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

[回答番号:No.3] の DOUGLAS_ です。  ちょっとしたミスですが、 Cells(1, j + 1) = .Fields.Item(j).Name の行は、 If i = 1 Then Cells(1, j + 1) = .Fields.Item(j).Name に変えてください。  もちろん、 Application.ScreenUpdating = False などの処理はお好きなように。。。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

ごめんなさい。 Access側からのエクセルへの例でした。 応用してください。

ijuhyg
質問者

お礼

ありがとうございます。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

Private Sub Sample1()   Dim oApp As Object   Dim rs As New ADODB.Recordset   Dim i As Integer   Set oApp = CreateObject("Excel.Application")   oApp.Workbooks.Add   rs.Source = "SELECT * FROM Tbl;"   rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly   If (Not rs.EOF) Then     For i = 0 To rs.Fields.Count - 1       oApp.Cells(1, i + 1).Value = rs.Fields(i).Name     Next     oApp.Range("A2").CopyFromRecordset rs   End If   rs.Close   oApp.Visible = True   Set oApp = Nothing End Sub ※フィールド名は rs.Fields(i).Name でわかります ※得られたレコードセットを A2 から展開します ※ 参照設定 Microsoft ActiveX Data Objects X.Y Library Microsoft Excel X.0 Object Library ※ 処理が終わった後Excelを表示します。 (保存が必要なら処理を追加してください)

ijuhyg
質問者

お礼

ありがとうございます。 会社のデータなので明日会社行ったら早速試してみます。

関連するQ&A