• 締切済み

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

  • Accessで”データの競合"となる

    Access2010を使用しています。 テーブル更新後にフォームをクローズしようとすると”データの競合"とメーセージが表示されます。 レコードを追加する時はならないのですが、レコードを変更しようとするとメーセージが表示されます。 具体的には下記のようにコーディングしています。 何か指定もれがあるのでしょうか? With Application.CurrentDb Set oRS = .OpenRecordset("顧客マスター", dbOpenDynaset) oRS.FindFirst "顧客コード = " & Me.顧客コード If oRS.NoMatch = False Then oRS.Edit Else oRS.AddNew End If oRS("顧客コード").Value = Me.顧客コード.Value     (その他の項目を代入)    oRS.Update oRS.Close Set oRS = Nothing End With DoCmd.Close acForm, Me.Name

  • ACCESSとVBAとレコード

    こんにちわ。 このサイトは何回も利用させて頂いてるのですが、今回も宜しくお願い致します。 環境はOS:Xp・Access2000です。 フォームを開くときにレコードを並べ替えたいのですが、単に「顧客コード」を昇順で並べ替えるには Private Sub Form_Load() Me.OrderBy = "顧客コード" Me.OrderByOn = True End Sub というのは解ったのですが、 何の関連付けもしてない、指定のテーブルの内容を並べ替えるにはどのように記述したらよいのでしょうか? 「Me」の箇所をそのテーブル名 (例えば、顧客テーブル.OrderBy = "顧客コード") のようにすれば良いのでしょうか? 宜しくお願いします。

  • エクセルVBA「スピンボタン」について

    エクセルVBA「スピンボタン」について スピンボタンとテキストボックスを組み合わせて Private Sub SpinButton1_Change() Me.TextBox1.Value = Me.SpinButton1.Value End Sub Private Sub UserForm_Initialize() With Me.SpinButton1 .Min = 1 .Value = .Min End With Me.TextBox1.Value = Me.SpinButton1.Min End Sub というコードを書きました。 「1、2、3、・・・10、11、・・・」という数の増加を「01、02、03・・・10、11・・・」という風にしたいのですがどのようにコーディングすればよいのでしょうか?お願いします。.

  • VBA beforeprintについて

    Private Sub Workbook_BeforePrint(Cancel As Boolean) If ActiveSheet.Name = "sheet1" Then If Range("M1").Value = "" Then Cancel = True MsgBox ("名前を入力してください") Range("M1").Select Exit Sub End If ElseIf ActiveSheet.Name = "sheet2" Then If Range("A47").Value = 文字 Then Cancel = True    MsgBox ("日付を入力してください") Range("A47").Select Exit Sub End If Exit Sub End If End Sub 上記は印刷をする前に実行されるコードですが、上記を実行して印刷をした後に自動で下記のVBAを実行したいのですが Sub データー取り込み() ActiveSheet.Range("B2000:Z2000").Copy ChDir "\\データーA\データーB\データーC\データーD" Workbooks.Open Filename:="\\データーA\データーB\データーC\データーD\データーシート1.xls" Sheets("顧客データー").Select If Worksheets("顧客データー").Range("B18").Value = "" Then Worksheets("顧客データー").Range("B18").PasteSpecial Paste:=xlPasteValues Else Worksheets("顧客データー").Range("B65536").End(xlUp).Offset(1, 0).PasteSpecial _ Paste:=xlPasteValues End If ActiveWorkbook.Save ActiveWindow.Close End Sub 上記のコードと下記のコードをどのように絡めたらいいのかわかりません。アドバイスお願いします。

  • Access2000 VBAについて質問です。

    Access2000 VBAについて質問です。 下記ソースコードでUPDATE(更新)しているのですが、バチンとAccessが落ちてしまいます。 Private sub UPDATESQL() StrSQL = "SELECT * FROM T_StandardList WHERE ID = " & Me.ID Set ct = CurrentProject.Connection RS.CursorLocation = adUseClient RS.Open StrSQL, ct, adOpenDynamic, adLockOptimistic RS![filed1] = Me![Value1] RS![filed2] = Me![Value2] RS![filed3] = Me![Value3] RS![filed4] = Me![Value4]      Call CloseButton_Click Set RS = Nothing Set ct = Nothing End Sub Private Sub CloseButton_Click() DoCmd.SetWarnings False 'SQLの実行 DoCmd.RunSQL "DELETE FROM T_TempList" DoCmd.Close acForm, Me.Name DoCmd.SetWarnings True End Sub CloseButtonをクリックしても落ちることがあるので、CloseButton_Click関数が怪しいとは感じます。 どなたか詳しい方アドバイスよろしくお願いいたします。 m(_ _)m

  • エクセルVBA「型が一致しません。」

    エクセルVBA「型が一致しません。」 ユーザーフォームの実行時に上記エラーが出ます。おそらく関係ありそうなコードが以下です。 ちなみにTextBoxはスピンボタンと併用して使用しています(そちらのコーディングには問題なし) Private Sub TextBox1_Change() Me.TextBox3.Value = Me.TextBox1.Value * Me.TextBox2.Value End Sub Private Sub TextBox2_Change() Me.Textbox3.Value = Me.TextBox1.Value * Me.TextBox2.Value End Sub Private Sub UserForm_Initialize() Me.TextBox3.Value = Me.TextBox1.Value * Me.TextBox2.Value 立て続けに質問してしまい申し訳ないですが何せ急いでいるもので・・・お願い致します

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

  • vbaで帳票フォームで開きたい アクセス

    vbaでフォームを開くときに 既定のビューを指定してるのですが 指定したとおりになりません。 Private Sub Form_Load() Me.DefaultView = 1 '帳票フォーム End Sub としてもデータシートビューで開かれてしまいます。 Private Sub Form_Load() Me.DefaultView = 1 '帳票フォーム MsgBox Me.DefaultView End Sub とすると、1が返るのに やっぱりデータシートビューになってしまいます。 なぜでしょうか? エラーにもなりません。

  • AccessのVBAで教えて下さい

    フォームから「計算月」を入力した時、T_稼働日テーブルから年月で一致した稼動日数を所定就業日数に代入する処理を下記のように作りました。「計算月」に一致するデータがなかった時の処理を、If文以下のようにしたのですがうまくいきません。どのようにしたらよいでしょうか? どなたか教えて下さい。よろしくお願いします。 Private Sub 計算月_AfterUpdate()    所定就業日数 = DLookup("稼動日数", "T_稼動日数", "年月=" & 計算月)     If Me.所定就業日数 = Null Then       MsgBox "稼動日数を確認して下さい"     End If End Sub

  • VBAで複数検索、AdvancedFilter

    AdvancedFilterを使って、検索を行っているのですが、応答なしと固まってしまったり、動作が重くなったりするのですが、原因わかりますでしょうか? 3000行くらいなのですが、ユーザーフォームを立ち上げて、検索、結果を見て、また検索をしようとすると固まったりして動かなくなって強制終了になる場合があります。 軽くなる方法はありますか? Private Sub CommandButton1_Click() Worksheets("商品マスタ").Activate If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData ActiveWindow.ScrollRow = 3 Range("S1:AA4").ClearContents Range("S1:AA4").NumberFormatLocal = "@" Range("T2:U2").Value = Range("B2:C2").Value Range("V2:X2").Value = Range("D2").Value Range("Y2:Z2").Value = Range("E2:F2").Value Range("AA2").Value = Range("G2").Value If Me.TextBox1.Value <> "" Then ' コード Range("U3").Value = "*" & Me.TextBox1.Value End If If Me.TextBox2.Value <> "" Then ' メーカー Range("V3").Value = "*" & Me.TextBox2.Value & "*" End If If Me.TextBox3.Value <> "" Then ' シリーズ Range("W3").Value = "*" & Me.TextBox3.Value & "*" End If If Me.TextBox4.Value <> "" Then ' サイズ Range("W3").Value = "*" & Me.TextBox4.Value & "*" End If If Me.TextBox5.Value <> "" Then ' 入荷日 Range("T3").Value = Me.TextBox5.Value End If If Me.TextBox9.Value <> "" Then ' 仕入れ先 Range("Z3").Value = Me.TextBox9.Value End If If Me.TextBox12.Value <> "" Then ' 単体価格 Range("AA3").Value = Me.TextBox12.Value End If If Me.TextBox6.Value <> "" Then ' 在庫数 Range("Y3").Value = Me.TextBox6.Value End If If Cells(3, Columns.Count).End(xlToLeft).Column > 19 Then Range("A2:G" & Rows.Count).AdvancedFilter Action:=xlFilterInPlace, _ CriteriaRange:=Range("S2").CurrentRegion, Unique:=False End If Range("S1:AA4").ClearContents ActiveWindow.ScrollColumn = 4 Range("A2").Activate End Sub Private Sub CommandButton2_Click() Unload Me End Sub