dポイントプレゼントキャンペーン実施中!

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
======================

※初心者ですので、わかりやすく回答していただけると助かります。

A 回答 (6件)

& "WHERE 年月 = " & Me.年月.Value & " " _


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

DAOの場合 not .EOF かもです。

以下で確認を・・・。

http://www.accessclub.jp/dao/index.html
    • good
    • 0

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

「ACCESS(VBA)の検索結果判定につ」の回答画像4
    • good
    • 0

補足: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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

BOF/EOF等の使い方等をもう少し悩んで勉強してみます。

Find使用時のNomatchの使い方まで、
ありがとうございます。

※数年前にIT業界から離れ、現在まったく違う業界に転職して
 ひさびさにプログラムに触れております。

お礼日時:2014/10/30 22:16

NoMatchプロパティは Recordsetをオープンしただけの状態では Falseに設定されているようですよ



抽出データが存在があるのかどうかは RecordCountが0か検査したほうがいいでしょう

NoMatchは Find系のメソッドの結果が反映されるようですので

rs.FindFirst("検索条件")
を実行した後なら 有効な値を示します
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

Recordsetをオープンしただけでは、Falseだったんですね。
まったくの無知ですみません。

お礼日時:2014/10/30 21:54

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を触った最後。間違っていたら悪しからず。
「ACCESS(VBA)の検索結果判定につ」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!