みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excel VBA : Accessのデータを検索

Excel VBA を使って、Accessのデータを検索したい。

除外テーブルには「管理ID」レコードが在り、ユニークな番号を登録してあります。

やりたいことは、除外テーブルの管理IDに在るであろう、"E003"の有無を確認したいと思います。

作ってみたソースコードは、以下の通り。

Private Sub aSearch_Click()
DB.TableOpen ("db_name.mdb") 'Accessのファイル
DB.FindRecode ("E003")  ' 検索対象文字列
DB.TableClose
End Sub

------------------------------ここから、標準モジュール

Public adoCn As ADODB.Connection
Public adoRs As ADODB.Recordset
Public fSql As String
Public fRow As Integer

'データ ソースへの接続と、レコードセットへの接続
Sub TableOpen(ByVal mdb_name As String)
Set adoCn = New ADODB.Connection 'データ ソースへの接続
adoCn.Provider = "Microsoft.Jet.OLEDB.4.0" 'Accessへ接続プロバイダ名
adoCn.Open mdb_name '接続するmdbファイル名"

fSql = "select 管理ID from 除外テーブル"
Set adoRs = New ADODB.Recordset 'レコードセットへの接続
adoRs.Open fSql, adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行
' adoRs.Open "除外テーブル", adoCn, adOpenKeyset, adLockReadOnly 'クエリーの実行


End Sub

'レコード(管理ID)の検索
Function FindRecode(ByVal findName As String) As String

adoRs.Find adoRs.Fields("管理ID") & "=" & findName     '← ここでエラーとなる 
If adoRs.RecordCount = 0 Then
MsgBox "該当するレコードは存在しません"
FindRecode = ""
Exit Function
Else
Do     ' Doループは、要らないかも???
Debug.Print adoRs.Fields("管理ID") & "/" & adoRs.Fields("登録日")
adoRs.MoveNext
Loop Until adoRs.EOF
End If

FindRecode = adoRs.Fields("管理ID")
End Function


'データ ソースへの接続と、レコードセットを切断する
Sub TableClose()
adoRs.Close 'クエリーを閉じる
adoCn.Close 'データ接続を閉じる
Set adoRs = Nothing
Set adoCn = Nothing
End Sub

------------- ここまで

データのソースから、検索する方法が良く判っておらず、Open / find の使い方はこれで良いのでしょうか。

以上、よろしくお願いします。

投稿日時 - 2010-11-30 17:54:05

QNo.6354234

すぐに回答ほしいです

質問者が選んだベストアンサー

考え方が全然違います。
Findでは探す条件を指定するのです。
例えば"管理ID='111'"のような指定になります。
>adoRs.Find adoRs.Fields("管理ID") & "=" & findName
これだと、レコードセットの管理IDが左辺になってしまい、
"E003=E003"のような文字列になります。しかも、
管理IDが数値なら良いですが、文字列なので引用符で
囲む必要があります。

それと「あるなし」を調べるだけならFindは使わない方が
良いでしょう。つまり、SQLを次のようにします。

fSql = "select 管理ID from 除外テーブル"
fSql = fSql & " where 管理ID='" & findName & "'"

これでレコードセットを作り、EOFプロパティを見ます。
Trueなら該当レコードが無く、Falseなら該当レコードが
あります。その後Closeすれば良いでしょう。

投稿日時 - 2010-11-30 19:39:28

補足

ご回答を戴きまして、誠に有難うございます。

この方法ですと、adoRs.EOFにデータの有無を調べるだけで、"E003"を調べません。
"S003"と入力をして、Trueになるはず(データには存在しません)がFalseになってしまいます。

つまり、Do - Loop で該当する"E003"の確認をすることになるのでしょうか?

Function FindRecode(ByVal findName As String) As String

fSql = fSql & " where 管理ID='" & findName & "'" 'レコードセット
If adoRs.EOF = True Then
MsgBox "該当するレコードは存在しません"
FindRecode = ""
Exit Function
Else
MsgBox "該当するレコードを、発見!!"
Do
Debug.Print adoRs.Fields("管理ID")
adoRs.MoveNext
Loop Until adoRs.EOF
End If

FindRecode = adoRs.Fields("管理ID")
End Function



私の解釈が間違っていたら、指摘してください。

投稿日時 - 2010-12-01 10:02:00

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問