• 締切済み

ACCESS(VBA)の検索結果判定について

ACCESS(VBA)の検索処理にて 以下のVBAを実行すると、かならず「★データあり処理」 に流れてしまいます。 確実に検索結果がヒットしない状態(データ全削除)にしても 同じです。 何故なのでしょうか。。 ====================== Private Sub xx_Click() Dim sSql As String sSql = "SELECT 年月 FROM 材料明細トランザクション " _ & "WHERE 年月 = " & Me.年月.Value & " " _ & "AND 材料顧客コード = " & Me.材料顧客コード.Value & " " _ & "AND 現場コード = " & Me.現場コード.Value Set db = CurrentDb Set oRs = db.OpenRecordset(sSql) If oRs.NoMatch = False Then '★データあり処理 Else 'データなし処理 End If End Sub ====================== ※初心者ですので、わかりやすく回答していただけると助かります。

みんなの回答

回答No.6

& "WHERE 年月 = " & Me.年月.Value & " " _ & "AND 材料顧客コード = " & Me.材料顧客コード.Value & " " _ & "AND 現場コード = " & Me.現場コード.Value データ型はすべて数値型なのでしょうか?ふと気になりました。

回答No.5

DAOの場合 not .EOF かもです。以下で確認を・・・。 http://www.accessclub.jp/dao/index.html

回答No.4

図を添付するのを忘れていました。

回答No.3

補足:WHERE 節を指定しているSQL文の場合は・・・。 条件を指定して見つける必要はないので・・・。一般的には、次のように書きます。DAOではなくADOですが、考え方は同じです。(多分) Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function

reeeeeeeeeeeeee
質問者

お礼

ご回答ありがとうございます。 BOF/EOF等の使い方等をもう少し悩んで勉強してみます。 Find使用時のNomatchの使い方まで、 ありがとうございます。 ※数年前にIT業界から離れ、現在まったく違う業界に転職して  ひさびさにプログラムに触れております。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

NoMatchプロパティは Recordsetをオープンしただけの状態では Falseに設定されているようですよ 抽出データが存在があるのかどうかは RecordCountが0か検査したほうがいいでしょう NoMatchは Find系のメソッドの結果が反映されるようですので rs.FindFirst("検索条件") を実行した後なら 有効な値を示します

reeeeeeeeeeeeee
質問者

お礼

ご回答ありがとうございます。 Recordsetをオープンしただけでは、Falseだったんですね。 まったくの無知ですみません。

回答No.1

Public Function DbSeek(ByVal strQuerySQL As String, _            ByVal strFind As String, _            ByVal strFldName As String) As Variant On Error GoTo Err_DbSeek   Dim DataValue   Dim DB     As DAO.Database   Dim rst     As DAO.Recordset   Set DB = CurrentDb   Set rst = DB.OpenRecordset(strQuerySQL)   With rst     '.FindFirst strFind     Debug.Print .NoMatch     If Not .NoMatch Then       DataValue = rst.Fields(strFldName)     End If   End With Exit_DbSeek: On Error Resume Next   rst.Close   Set rst = Nothing   DbSeek = DataValue   Exit Function Err_DbSeek:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DbSeek)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DbSeek End Function このような DBSeek()を作成してみました。 添付図の冒頭では、.FindFirst strFind をコメントアウトしていません。二番目はコメントアウトしています。この場合、 .NoMatch の値は False です。なぜなら、.FindFirst を実行していないからです。よって、"ID=4"と指定しているにも関わらず"ID=1"のレコードの値を返しています。そこで、コメントアウトしないで実行すると、"ID=4"が見つからなかったので.NoMatch の値はTrueになり空文を戻しています。 で、結局は、.FindFirst XXXXX が欠落していることが原因かと推測されます。 *1996年がAccessを触った最後。間違っていたら悪しからず。

関連するQ&A