[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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.