- ベストアンサー
VBA ADOの実行時エラーと値の取得
- VBAのADOを使用してAccessのテーブルから値を取得する際、特定の値を取得しようとするとエラーが発生します。
- さらに別の値に変更すると、別のエラーが発生します。
- 原因や解決策が分からず、問題を解決する方法を探しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No2で変数の宣言が抜けていました。 Dim partSQL As String を追加してください。それと、 Debug.Print rs!名前 & "-------" & rs!最終登録日 を、 Debug.Print rs!名前 & "-------" & " rs!Password & "-----" & rs!最終登録日 としてください。Passwordの取得が抜けていました。 なお、Accessだけなのか、あるいはExcelなどでのVBAなのか 明記されていないので、一応質問のADOでNo2を書くと、 Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim strSQL As String Dim partSQL As String partSQL = "aaa(bbb)" strSQL = "SELECT TPW.サイト名, TPW.Password, Max(TPW.日付) AS 最終登録日 FROM TPW GROUP BY TPW.サイト名 HAVING (TPW.サイト名 Like '*" & partSQL & "*');" Set cn = New ADODB.Connection cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" & "D: \PW.accdb" Set rs = New ADODB.Recordset rs.Open strSQL, cn, adOpenStatic, adLockPessimistic Debug.Print rs!名前 & "-------" & " rs!Password & "-----" & rs!最終登録日 rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing
その他の回答 (2)
- piroin654
- ベストアンサー率75% (692/917)
No1です。 >Passwordフィールドに依然入っていた値が取得されてしまいます。 ということですから、実際には同じサイト名が複数ある、ということですかね。 であれば、どのレコードが一番新しいPasswordなのかは、たとえば日付/時刻 であったり、登録順にたとえばオートナンバーが振ってあったりしないと 一番新しいPasswordは特定できません。あるいは、Passwordの表記方法に 何らかの順列を示すものがある場合です。 そこで、登録した日付があるとして、たとえば、以下のようなクエリを作成するとか、 SELECT TPW.サイト名, TPW.Password, Max(TPW.日付) AS 最終登録日 FROM TPW GROUP BY TPW.サイト名 HAVING (TPW.サイト名 Like '*aaa(bbb)*'); あるいは、このクエリのSQL文をプロシージャに組み込み、 Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSQL As String partSQL = "aaa(bbb)" strSQL = "SELECT TPW.サイト名, TPW.Password, Max(TPW.日付) AS 最終登録日 FROM TPW GROUP BY TPW.サイト名 HAVING (TPW.サイト名 Like '*" & partSQL & "*');" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL) Debug.Print rs!名前 & "-------" & rs!最終登録日 rs.Close: Set rs = Nothing db.Close: Set db = Nothing のように、してみるとかです。なお、上記はDAOです。字数の関係で DAOにしています。このまま使用する場合は、コード表の参照設定で DAOにチェックが入っているか確認してみてください。
- piroin654
- ベストアンサー率75% (692/917)
Find の引数のSkipRowsの値を0だけで更新しなくても 何も問題は起こらなかったのですか? サイト名 = 'aaa(bbb)' で、aaaとは、()の中の bbb は何を意味しているのですか? Findは普通はレコードの先頭から検索します。aaa(bbb) というサイト名がテーブルに複数あるのならば、最初のレコードが 取り出されたのでしょう。必要ならば、連続検索をするならば、 Loop処理をして検索します。 >aaa(bbb)と言う値を >aaaに変更し、 >rs.Find "サイト名 = 'aaa'", 0, adSearchForward >とすると、 >実行時エラー3021 >「BOFとEOFのいずれかTRUEになっていか、・・・ これは、そのようなデータがないということです。 Findはデータの並びによってはあまり精度がよくないときも あるのであまり使いません。 Findの使い方は、以下にありますが、 http://www.geocities.jp/cbc_vbnet/ADO/find.html Loop処理、SkipRpwsなどもあります。 一度、普通に、レコードにフィルタをかけて、 rs.Filter = "サイト名 like 'aaa(bbb)*'" rs.MoveFirst Do Until rs.EOF Debug.Print rs!サイト名 & "------" & rs!Password rs.MoveNext Loop としてみては?