- ベストアンサー
(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でやりたいので どなたかご教授よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
現状、お示しのコードでちゃんと動いているのでしたら、 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
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
質問のコードで動きましたか?疑問あり。 出来るだけ完全なものを上げてください。 私の場合でやってみた。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列 氏名 学校 大田黒 南小学校 上野 北小学校 目黒山上 中興小学校 木下 中央小学校 ・・ となったから間違いないでしょう。 ーー エクセル側で参照設定が必要。
お礼
すいません。一部端折ってしまいました。 ありがとうございます。
- DOUGLAS_
- ベストアンサー率74% (397/534)
[回答番号: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)
ごめんなさい。 Access側からのエクセルへの例でした。 応用してください。
お礼
ありがとうございます。
- 30246kiku
- ベストアンサー率73% (370/504)
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を表示します。 (保存が必要なら処理を追加してください)
お礼
ありがとうございます。 会社のデータなので明日会社行ったら早速試してみます。
お礼
できました。ありがとうございます。