レコードセットのエラー への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 るきお  (社会人) 投稿日時 2011/5/23 21:25:32
>hrs.MoveNextがないと同じレコードでずっとループ
これか!
見逃してました。

私もときどきやりましたよ。
いつまでたっても処理が終わらないななんて言ったりして…。
投稿者 dao  (社会人) 投稿日時 2011/5/23 20:02:20
すいません。movenextをうち忘れていました。無地にプログラムうまくできました。ありがとうございました
投稿者 shu  (社会人) 投稿日時 2011/5/23 13:52:27
> NNB(i) = hrs("NO")
の下に hrs.MoveNextがないと同じレコードでずっとループするので
配列の範囲を超えてしまいエラーとなってしまいます。
最初のエラーとはまったく関係ありません。
またるきおさんが指摘されているようにレコード数が配列の要素数を超えてしまうと
結局同じエラーが発生することになります。これに対する処理も追加された方が良いかと
思います。
投稿者 るきお  (社会人) 投稿日時 2011/5/22 13:37:09
こんにちは。

>まったくうまくいけません。
なぜそのように考えたのでしょうか?
はじめの、「パラメーターが少なすぎます。1を指定してください。」というエラーがでなくなったということはむしろうまくいったとは考えられませんか?

>すぐにレコードが1件しかないのに「インデックス有効範囲がありません」って出ます。
多分「インデックスが有効範囲にありません」でしょうか?
エラーで困って質問する場合はエラーが発生する行がどこだかわかるようにしましょう。

エラーになるのが
>n(i) = hrs("年")
か、
>NNB(i) = hrs("NO")
の行であれば、レコードが101件以上あるからかと思います。

まずはどの行でエラーになるかを書きましょう。
上記の行でエラーになるのであればその時 i はいくつか確認しましょう。


投稿者 dao  (社会人) 投稿日時 2011/5/22 09:50:46
まったくうまくいけません。
 "SELECT 受け取った人.[年], 受け取った人.[NO] FROM 受け取った人 WHERE (((受け取った人.年)=" & Forms![年賀メール].[m年] & "));"
これであっていますか。
実行してみたら
   hrs.MoveFirst
   i = 0
Do Until hrs.EOF
   i = i + 1
   n(i) = hrs("年")
  NNB(i) = hrs("NO")
Loop

すぐにレコードが1件しかないのに「インデックス有効範囲がありません」って出ます。
教えてください
投稿者 shu  (社会人) 投稿日時 2011/5/21 21:35:50
[Forms].[年賀メール].[m年] の部分がテーブルにないので
パラメータとして認識されパラメータ指定が1個不足しているので1(個)を
指定して下さいというエラーです。

簡単な修正なら

> Forms].[年賀メール].[m年]
を " & Forms].[年賀メール].[m年] & "
にすればいいです。

この修正はSQLインジェクションの問題が発生する可能性があるのでパラメータ化
することが推奨されています。ただこの場合、入力値の文字数とか内容のチェックが
されていればこの修正で大丈夫かと思います。
投稿者 DAO  (社会人) 投稿日時 2011/5/21 21:21:11
   Private Sub Form_Close()
   
   DoCmd.SetWarnings 0
   Dim DB As DAO.Database
   Dim wrs As DAO.Recordset
   Dim hrs As DAO.Recordset
   Dim prs As DAO.Recordset
   Dim n(100) As Long
   Dim NNB(100) As Long
   Dim i As Long
   Dim sql As String

sql = "SELECT 受け取った人.[年], 受け取った人.[NO] FROM [受け取った人] WHERE (((受け取った人.[年])=[Forms].[年賀メール].[m年]));"


   Set DB = DBEngine.Workspaces(0).Databases(0)
   Set crs = DB.OpenRecordset("ワークテーブル")  '年賀メール 
   Set hrs = DB.OpenRecordset(sql)               '受け取った人 
   Set prs = DB.OpenRecordset("受け取った人")     '受け取った人 
   
'比較対象作成 
   hrs.MoveFirst
   i = 0
Do Until hrs.EOF
   i = i + 1
   n(i) = hrs("年")
  NNB(i) = hrs("NO")
Loop

'主処理 
crs.MoveFirst
Do Until crs.EOF
   For i = 1 To 100
       If crs("年") = n(i) And crs("NO") = NNB(i) Then GoTo t
       Next i
       prs.AddNew
       prs("年") = crs("年")
       prs("NO") = crs("NO")
       prs("氏名") = crs("氏名")
       prs("連名") = crs("連名2")
       prs.Update
       
        
t:
       crs.MoveNext
   Loop
   end sub


Access2010で開発しているプログラムです。
実行したら、「Set hrs = DB.OpenRecordset(sql)   」のところで「パラメーターが少なすぎます。1を指定してください。」というエラーが出ます。「1」を指定するとテーブルタイプなので、もちろん「SQL分は使えません」というエラーが出ます。この解決方法があれば教えてください
皆さんのお力お貸しください。