• ベストアンサー

"カレントレコードがありません"とでてきます

Access97を使用しています。 データは テーブルAの項目B、項目Cが下記のようにあるとします。 フォーム上のText"B"に項目Bを入力します。 項目B 項目C 11 a 11 b 22 aa 22 bb 22 cc 33 aaa 33 ccc この時 Set DB = CurrentDb() strSQL = "SELECT * FROM A WHERE " strSQL = strSQL + "B='" & Me.B & "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) RS.MoveFirst RS.MoveLast m = RS.RecordCount For i = 1 To m COIL_N = RS.Fields("C") Call RS.MoveNext Next i 上記のようなモジュールですが、例えば 項目Bの"11"を選んだ時、項目Cの二番目のデータbが 取得できません。 "カレントレコードがありません"とでてきます。何故でしょうか?

  • cdma
  • お礼率36% (91/247)

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

  • ベストアンサー
  • Traja
  • ベストアンサー率19% (107/546)
回答No.3

RS.MoveLast した時点で、レコードセットの最終レコードがカレントになっていますよね その後 RS.MoveNext すれば、EOFになりますからカレントは無くなります。 恐らくレコードセットの1レコード目は、bで2レコード目がaなのでは? その辺は、キー設定がどのようになっているかに依存しますから。

cdma
質問者

お礼

ありがとうございました。上手く行きました。

その他の回答 (2)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 No.1の人の言う通り、1行実行しながら変数などに格納される値をモニタしてみることです。 "カレントレコードがありません。" というエラーの場合は、レコードセットのEOFかBOFプロパティがTrueになっていることが原因ではないでしょうか。 それから、気になった点は何故 RS.MoveFirst RS.MoveLast としているのかという点です。 あと、レコードセットの読み込みはForループより、DoループでEOFプロパティに格納される値を条件にした方がいいと思います。 Do Until (RS.EOF)   COIL_N = RS.Fields("C")   RS.MoveNext Loop という感じです。 MoveFirstとMoveLastをなしにして、上記のコードにすればOKだと思います。

cdma
質問者

お礼

ありがとうございました。上手く行きました。

  • redsky
  • ベストアンサー率18% (66/360)
回答No.1

ブレイクポイントを設定して1行ずつ実行すれば、原因がわかりそうな 質問ですね。 とりあえず、mにしかるべき数字(この場合は2)がちゃんと入ってる か確認してみては? あと最後から2番目のCALL文て必要なんですか? なくてもいいような・・。

関連するQ&A

  • ACCESS97のMAX関数について

    ACCESS97を使用しています。 "関数"の使い方が全くわかりません。 (というより、SQLも含めて…)  テーブル"TBL_A"の"項目B" から最大値を変数SDHSに取得したいのですが どうすればいいのでしょうか?  Dim db As DATABASE Dim RS As Recordset Dim SDHS, strSQL As String Set db = CurrentDb() strSQL = "SELECT Max(項目B) FROM TBL_A ;" Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) SDHS = Max(項目B)

  • SQLの条件分に ( ) が入っている場合

    Access97を使用しています。 SQLの条件で、項目名に '(' が入っている場合 どうすればいいのでしょうか? 例えば 下記の場合 " 式に未定義関数 '出荷日'があります " と出てきます。 Set DB = CurrentDb() strSQL = "SELECT SUM(数量) AS A FROM GAH100 WHERE " strSQL = strSQL + "出荷日(新)='" & Me.日付入力 "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) 項目名に() が無いようにするしかないのでしょうか?

  • adoのループについて カレントレコードについて

    adoのFor i = 1 To rs.RecordCountについて質問があります。 Sub test() Dim i As Long Dim MyFileName As String Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "Tテーブル", cn, adOpenKeyset, adLockOptimistic For i = 1 To rs.RecordCount Debug.Print rs.Fields(0).Value rs.MoveNext Next rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これを実行した時に、テーブルには、1,2,3・・・という値が入っていて、 イミディエイドウインドウにも1,2,3・・・と順番に取得されるのですが、 For i = 1 To rs.RecordCountを実行した時は、強制的にrs.MoveFirstされるのでしょうか? For i = 1 To rs.RecordCount rs.MoveFirst Debug.Print rs.Fields(0).Value rs.MoveNext Next これと同じ意味なのでしょうか? RecordCount プロパティ (ADO) のヘルプを見ましたが、この件に関する記述は探せませんでした。 ご回答よろしくお願いします。

  • Recordcountについて

    ACCESS97を使用しています。 テーブルAの項目1の中で、テキスト1に入力した値をキーに SELECTし そのデータ件数を知りたいのです。 しかし、下記のようにすると、0件の時はintcountは 0 になるのですが 1以上の場合、複数でも intcountは 1になります。 1件と 2件以上が区別できません。 何故でしょうか? Set db = CurrentDb() strSQL = "SELECT * FROM テーブルA WHERE " strSQL = strSQL + "項目1='" & Me.テキスト1 & "';" Set RS1 = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) intcount = RS1.RecordCount If (intcount = 0) Then Me.テキスト2 = "使用無し" ElseIf (intcount = 1) Then Me.テキスト2 = "1件使用" ElseIf (intcount > 1) Then Me.テキスト2 = "複数使用" End If

  • レコード件数が返らない理由がわからない

    テーブル1にはレコードが5件入ってるのですが Private Sub レコード件数() Dim strSQL As String Dim rs As DAO.Recordset strSQL = "SELECT * FROM テーブル1;" Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) Debug.Print rs.RecordCount End Sub これをすると1が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?

  • 条件分に数値型は可能?

    ACCESS97を使用しています。 SQLの中で 数値型の場合、条件式に適用できないのでしょうか? 例えば 下記の場合 Set DB = CurrentDb() strSQL = "SELECT * FROM テーブルA WHERE " strSQL = strSQL + "コード ='" & YU(i) & "'" strSQL = strSQL + " AND ラベルNO='" & RA(i) & "';" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) YU(i)は、文字型、RA(i)は数値型です。 RA(i)で"抽出条件でデータ型が合いません"と出ます。 コードは文字型、ラベルNOは数値型です。数値型では条件として適用できないのでしょうか? 可能な場合、上のような表現ではできないのでしょうか?

  • 条件によって、Where分のキーを変更させたい

    ACCESS97を使用しています。SQL文の中で、変数?を使用したいのですが、 その扱いがわかりません。 例) 下記のようなテーブルがあります。 項目(1) 項目(2) 項目(3) 項目(4) 項目(5) 1 A 100 EE RR 2 B 200 EE RR 3 A 100 EE RR 4 A 100 CC EE 5 B 300 RR EE 6 A 100 RR EE 7 B 200 CC RR フォーム上で、項目(2)を入力します。(入力_1) また、もう1つ、データを入力します。(入力_2、EE,CC,RR) 項目(2)の値によって、 Aの時、項目(4) Bの時、項目(5)をみにいくようにしたいのです。 例えば、入力_1=A、入力_2=EEの時、 合計値200 (項目(1)は、1,3)     入力_1=B、入力_2=EEの時、 合計値300 (項目(1)は、5) この時、下記のようなロジックを組んでみたのですが パラメーターが少なすぎます と出てきます。  (SELECT対象は、一旦 * にしています) Dim KEY As String If (ME.入力_1 = "A") Then  '条件は別入力です。 KEY = "項目(4)" Else KEY = "項目(5)" End If Set RS = Nothing Set DB = Nothing Set DB = CurrentDb() strSQL = "SELECT * FROM テーブル WHERE " strSQL = strSQL + "KEY='" & Me.入力_2 & ";" strSQL = strSQL + "AND 項目(2)='" & Me.入力_1 & "'" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) KEY をどのようにすればいいのかがわかりません。 宜しくお願いします。

  • AccessSQL COUNT文で該当レコード抽出したい

    初心者です。 Access2000であるテーブルの条件に一致した レコード件数を抽出するSQLを作成しました。 条件に該当しない場合も1件で件数が戻ってきてしまいます。 AccessクエリでSQLを貼り付けて 検証した場合はちゃんと0件になるのですが VBAのコードではうまく件数が抽出されません。 簡単なことだったらごめんなさい。 いろいろなサイトで探した末、 どうしても解決できないので ご教授よろしくお願いします。 Dim strSQL As String Dim db As DAO.Database Dim rs As DAO.Recordset  Dim IntCount As integer 'SQL文を生成 strSQL = "SELECT COUNT(*) AS 件数 FROM テーブル名 " strSQL = strSQL & "WHERE テーブル名.コード = '" strSQL = strSQL & Forms![フォーム名]![txtコード] strSQL = strSQL & "' AND Left([テーブル名]![区分],1) = '" strSQL = strSQL & Forms![フォーム名]![cnb種類].Column(0) strSQL = strSQL & "' AND テーブル名.名称 = '" strSQL = strSQL & Forms![フォーム名]![txt名称] strSQL = strSQL & "';" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) IntCount =  rs.RecordCount rs.Close Set db = Nothing Set rs = Nothing

  • DAOでレコード数を取得したい(ACESSVBA)

    レコードの行数は複数あるのに --------------------------------------------------------- Sub あ() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T_test", dbOpenDynaset) MsgBox rs.RecordCount Set rs = Nothing Set db = Nothing End Sub --------------------------------------------------------- これでレコード数を取得しようとすると1がかえるのですが なぜレコードの行数を取得できないのでしょうか?

  • テーブルのレコードが0件時にmsg表示(アクセス)

    とてつもない初歩的な質問で すみません! フォーム1をメニュー画面として、 フォーム1にある「ボタン」を押すと テーブルにレコードが追加され、処理が走る・・・という仕様を作っています。 ですが、 このテーブルにレコードが追加されなかった=0件 の場合の回避策を どうしたら良いのかが わかりません。 ちなみに、 Private Sub ボタン_Click() On Error GoTo errmsg DoCmd.SetWarnings False Dim DB As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Long Set DB = CurrentDb Set rs1 = DB.OpenRecordset("テーブル1") Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF If rs1!フィールドA1 = rs1!フィールドA2 Then rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = rs1!フィールドA1 rs2!B = rs1!フィールドB rs2!C = rs1!フィールドC rs2.Update End If If rs1!フィールドA1 < rs1!フィールドA2 Then For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1 rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = i rs2!フィールドB = rs1!フィールドB rs2!フィールドC = rs1!フィールドC rs2.Update Next i End If rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing DB.Close: Set DB = Nothing Call 次処理 errmsg: MsgBox "元データが未投入です。" End Sub としたのですが、 これでは データが投入され、処理が成功=完了した場合にも エラーメッセージが出てしまいました。 ご教示いただけますと幸いです。 お手数をおかけしますが、よろしくお願い致します。

専門家に質問してみよう