[[20101020171137]] 『adoでMDBの参照や変更...の続き』(ぷりん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『adoでMDBの参照や変更...の続き』(ぷりん)

[[20100922181041]]でご教授いただき問題なく使用してきましたが

 再度疑問が生まれました。

 Fieldsの取得時なのですがMDBの順番通りには取得できないものなのでしょうか?
 mdbのFields名を「01 名前」「02 住所」などとすると順番に取得は出来ますが
 変更の書き込み時にエラーになってしまいます。

 どなたかご教示ください。

 こんばんは
 rec.Fields(0)
 〜
 rec.Fields(9)
 とかで指定出来ませんか?
(ウッシ)


 対象のmdbファイルのテーブルは、どのように作成したのですか?
 これ、テーブルの中身のデータではなく、テーブルの骨格のことです。

 1 アクセスで手動操作でテーブル作成
     これだと普通に作成した場合、
      rec.Fields(0)
         〜
      rec.Fields(9)
     で出来そうですけどねえ。

 2 VBAコードでテーブルを作成
  >MDBの順番通りには取得できない
 これ、アクセスで見えているテーブルの順番ですよね?
 だとしら、私も経験したことがあります。
  ちょっと、再現手順をすぐに記述できませんが・・・。
  これだとしたら、
  テーブル作成コードを見せてください

 ichinose


 ウッシ様、ichinose様
 ありがとうございます。

 私の表現が間違っていた?ようです
 先日ご教授いただいたコードで使用していましたが
 理解が足りないのか?別のMDBで応用したところ

 Fields名はMDBの見たまんまで転記されますがレコードの
 順番がFields名とは違ってしまいます。

 アクセスのテーブルは手動で作成しました。
 デザインビューで手入力したものにデータをインポートしています。

 Sub Get_date()
On Error GoTo ErrorHandler
Dim cnn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Dim strSQL As String
Dim dbNAME, dbPath, myDB, tbl As String
dbNAME = "my_db.mdb" 
dbPath = Worksheets("設定").Cells(2, 2)
tbl = "情報"
myDB = dbPath & "\" & dbNAME
myHomeSheetsName = "date" 
Dim cat As New ADOX.Catalog
Dim col As ADOX.Column
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & myDB & ";"
Set cat = New ADOX.Catalog
cat.ActiveConnection = cnn
Worksheets(myHomeSheetsName).Select
cnt = 1
For Each col In cat.Tables(tbl).Columns
Cells(4, cnt) = col.Name: cnt = cnt + 1
Next
strSQL = "SELECT * FROM " & tbl
rec.Open strSQL, cnn, adOpenDynamic, adLockReadOnly
i = 5
rec.MoveFirst
Do While Not rec.EOF
For j = 0 To rec.Fields.Count
Worksheets(myHomeSheetsName).Cells(i, j + 1) = rec.Fields(j).Value
Next j
i = i + 1
rec.MoveNext
Loop
Set cat = Nothing
rec.Close: Set rec = Nothing
cnn.Close: Set cnn = Nothing
Exit Sub
ErrorHandler:
MsgBox (Err.Number)
Resume Next
Err.Clear
End Sub

 こんにちは
 > レコードの順番がFields名とは違ってしまいます。
 っていうのは意味が通らないですよ。

 提示されたコードは情報テーブルから全レコード抽出してるだけですよね?

 > 変更の書き込み時にエラー
 がどのようなコードで行っているのかが分かりません。

 あと、コードにはインデントを付けないと非常に読みにくいです。
(ウッシ)

 Worksheets(myHomeSheetsName).Cells(i, j + 1) = rec.Fields(j).Value
 この場合のjはFieldsの0(始まり)から終わりまでを順番にという意味ではないんですか?

 Worksheets(myHomeSheetsName).Cells(i, 1) = rec.Fields("日付").Value
 等にすると今後Fields増えた場合にも読み込んでくれないし、

 また私の思い込み勘違いワールドのような気がするw
 インデントの件、前回も指摘されていましたね。申し訳ないです(ぷりん)

 やはり私が理解していなかったようです。
 レコードの転記動作は間違っていませんでした。

 Fields名の転記が順番に飛んでいなかっただけでした。(ぷりん)

 cnt = 1
 For Each col In cat.Tables(tbl).Columns
     Cells(4, cnt) = col.Name: cnt = cnt + 1
 Next

 ここの部分を

 For j = 0 To rec.Fields.Count
     Worksheets(myHomeSheetsName).Cells(4, j + 1) = rec.Fields(j)
 Next j

 に変えても駄目でした。

 こんにちは
 Fields コレクション内の Index とField名の順序が違っていたとして、不都合な事はなんですか?
(ウッシ)

 例えば、MDBからエクセルへ転記したものを表で印刷する場合に表題とレコードが一致しないと具合が悪いですね。
 自分で(マクロでも)書き込んでもいいのですがフィールドが今後増やす場合も考えていたらMDBにあるフィールド名を順番に読み込ませれば対応できるなという結果になりました。
(ぷりん)

 Set myf = New ADODB.Recordset
 myf.Open strSQL, cnn, adOpenStatic, adLockReadOnly, adCmdText

 For i = 0 To myf.Fields.Count - 1
     Worksheets(myHomeSheetsName).Cells(4, i + 1).Value = myf.Fields(i).Name
 Next i

 myf.Close
 Set myf = Nothing

 上記コードにて自己解決しました。
 ありがとうございました。(ぷりん)

 こんにちは
 リンク先のスレッドに既にそのコードは書いたのですけど、見てなかったのですか?

    For cnt = 0 To rec.Fields.Count - 1
        sh.Cells(1, cnt + 7).Value = rec.Fields(cnt).Name
    Next cnt

 (ウッシ)

 ですwww

 お恥ずかしい限りで... その上のコードで頭が一杯でした。
 ネット検索で余計頭がこんがらがってしまいました。

 現在は日付で絞り込んだ検索(抽出して転記)で格闘中です。
 名前とかは普通に機能するのですがなぜ日付で期間指定すると駄目なんでしょうねぇ???

 調べまくって何しても駄目だったらまた別スレでお願いしたいと思います。
 (プリン)

 日付型フィールド値はピッタリの値では抽出出来ないので幅で指定します。
(ウッシ)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.