レコードセットのエラー への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 dao  (社会人)
投稿日時
2011/5/23 20:02:20
すいません。movenextをうち忘れていました。無地にプログラムうまくできました。ありがとうございました
投稿者 shu  (社会人)
投稿日時
2011/5/23 13:52:27
> NNB(i) = hrs("NO")
の下に hrs.MoveNextがないと同じレコードでずっとループするので
配列の範囲を超えてしまいエラーとなってしまいます。
最初のエラーとはまったく関係ありません。
またるきおさんが指摘されているようにレコード数が配列の要素数を超えてしまうと
結局同じエラーが発生することになります。これに対する処理も追加された方が良いかと
思います。
の下に hrs.MoveNextがないと同じレコードでずっとループするので
配列の範囲を超えてしまいエラーとなってしまいます。
最初のエラーとはまったく関係ありません。
またるきおさんが指摘されているようにレコード数が配列の要素数を超えてしまうと
結局同じエラーが発生することになります。これに対する処理も追加された方が良いかと
思います。
投稿者 るきお  (社会人)
投稿日時
2011/5/22 13:37:09
こんにちは。
>まったくうまくいけません。
なぜそのように考えたのでしょうか?
はじめの、「パラメーターが少なすぎます。1を指定してください。」というエラーがでなくなったということはむしろうまくいったとは考えられませんか?
>すぐにレコードが1件しかないのに「インデックス有効範囲がありません」って出ます。
多分「インデックスが有効範囲にありません」でしょうか?
エラーで困って質問する場合はエラーが発生する行がどこだかわかるようにしましょう。
エラーになるのが
>n(i) = hrs("年")
か、
>NNB(i) = hrs("NO")
の行であれば、レコードが101件以上あるからかと思います。
まずはどの行でエラーになるかを書きましょう。
上記の行でエラーになるのであればその時 i はいくつか確認しましょう。
>まったくうまくいけません。
なぜそのように考えたのでしょうか?
はじめの、「パラメーターが少なすぎます。1を指定してください。」というエラーがでなくなったということはむしろうまくいったとは考えられませんか?
>すぐにレコードが1件しかないのに「インデックス有効範囲がありません」って出ます。
多分「インデックスが有効範囲にありません」でしょうか?
エラーで困って質問する場合はエラーが発生する行がどこだかわかるようにしましょう。
エラーになるのが
>n(i) = hrs("年")
か、
>NNB(i) = hrs("NO")
の行であれば、レコードが101件以上あるからかと思います。
まずはどの行でエラーになるかを書きましょう。
上記の行でエラーになるのであればその時 i はいくつか確認しましょう。
投稿者 dao  (社会人)
投稿日時
2011/5/22 09:50:46
まったくうまくいけません。
"SELECT 受け取った人.[年], 受け取った人.[NO] FROM 受け取った人 WHERE (((受け取った人.年)=" & Forms![年賀メール].[m年] & "));"
これであっていますか。
実行してみたら
すぐにレコードが1件しかないのに「インデックス有効範囲がありません」って出ます。
教えてください
"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インジェクションの問題が発生する可能性があるのでパラメータ化
することが推奨されています。ただこの場合、入力値の文字数とか内容のチェックが
されていればこの修正で大丈夫かと思います。
パラメータとして認識されパラメータ指定が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分は使えません」というエラーが出ます。この解決方法があれば教えてください
皆さんのお力お貸しください。
これか!
見逃してました。
私もときどきやりましたよ。
いつまでたっても処理が終わらないななんて言ったりして…。