- 締切済み
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 ====================== ※初心者ですので、わかりやすく回答していただけると助かります。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- NotFound404
- ベストアンサー率70% (288/408)
& "WHERE 年月 = " & Me.年月.Value & " " _ & "AND 材料顧客コード = " & Me.材料顧客コード.Value & " " _ & "AND 現場コード = " & Me.現場コード.Value データ型はすべて数値型なのでしょうか?ふと気になりました。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
DAOの場合 not .EOF かもです。以下で確認を・・・。 http://www.accessclub.jp/dao/index.html
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
補足: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
- redfox63
- ベストアンサー率71% (1325/1856)
NoMatchプロパティは Recordsetをオープンしただけの状態では Falseに設定されているようですよ 抽出データが存在があるのかどうかは RecordCountが0か検査したほうがいいでしょう NoMatchは Find系のメソッドの結果が反映されるようですので rs.FindFirst("検索条件") を実行した後なら 有効な値を示します
お礼
ご回答ありがとうございます。 Recordsetをオープンしただけでは、Falseだったんですね。 まったくの無知ですみません。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
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を触った最後。間違っていたら悪しからず。
お礼
ご回答ありがとうございます。 BOF/EOF等の使い方等をもう少し悩んで勉強してみます。 Find使用時のNomatchの使い方まで、 ありがとうございます。 ※数年前にIT業界から離れ、現在まったく違う業界に転職して ひさびさにプログラムに触れております。