アプリ版:「スタンプのみでお礼する」機能のリリースについて

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でやりたいので
どなたかご教授よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/11 21:44

質問のコードで動きましたか?疑問あり。


出来るだけ完全なものを上げてください。
私の場合でやってみた。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列
氏名学校
大田黒南小学校
上野北小学校
目黒山上中興小学校
木下中央小学校
・・
となったから間違いないでしょう。
ーー
エクセル側で参照設定が必要。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/11 21:44

[回答番号: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
などの処理はお好きなように。。。
    • good
    • 0

ごめんなさい。



Access側からのエクセルへの例でした。

応用してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2009/05/11 21:44

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を表示します。
(保存が必要なら処理を追加してください)
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/07 23:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!