アプリ版:「スタンプのみでお礼する」機能のリリースについて

帳票形式フォームの参照整合性設定された表形式サブフォームから全レコードを削除する為、下記のモジュールを作成しました。しかし、実行すると「28:スタック領域が不足しています。」のエラー表示でフリーズ状態となってしまいます。エラーとなるのは毎回ではありません。原因と回避方法をご教示下さい。
連鎖削除設定して主レコードを削除する方法しかないのでしょうか?

On Error GoTo Err_削除_Click
Dim MyAnswer As Variant, MyRs As DAO.Recordset

Set MyRs = Me.SubForm.Form.Recordset

MyRs.MoveFirst
Do Until MyRs.EOF
MyRs.Delete
MyRs.MoveNext 'ここでエラーとなります。
Loop

Recovery_削除_Click:
Set MyRs = Nothing

Exit_削除_Click:
Exit Sub

Err_削除_Click:
If Err.Number = 3021 Then
Resume Recovery_削除_Click
Else
MsgBox Err.Number & ":" & Err.Description
Resume Exit_削除_Click
End If

A 回答 (2件)

削除クエリーの場合、サブフォームに#Deletedと表示


me!サブフォーム名.form.requery
じゃダメですかね。ゴミレス勘弁。

dao.recordset の件は分かりません。
調べる気力も体力もスキルも。。。
Access2010のヘルプでは
Sub SupplierID_AfterUpdate()
  Dim rst As DAO.Recordset
  Dim strSearchName As String

  Set rst = Me.Recordset
  strSearchName = CStr(Me!SupplierID)
  rst.FindFirst "SupplierID = " & strSearchName
  If rst.NoMatch Then
    MsgBox "Record not found"
  End If
  rst.Close
End Sub
ともなっています。
Sub CheckRSType()
  Dim rs as Object

  Set rs=Forms(0).Recordset
  If TypeOf rs Is DAO.Recordset Then
    MsgBox "DAO Recordset"
  ElseIf TypeOf rs is ADODB.Recordset Then
    MsgBox "ADO Recordset"
  End If
End
でRecordsetのどちらを使っているか判別できるようです。
投稿用にタブインデントは全角スペースにしています。

この回答への補足

ご教示頂いた方法でRecordsetのタイプを確認したところ、DAO Recordsetとなりました。現状DAO.を除いた宣言でエラーが出ないようですので、これで対応致します。種々お調べ頂き有難う御座いました。

補足日時:2013/08/21 13:07
    • good
    • 0

レコードセットを回して順次削除は行ったことがないのですが


MyRs.MoveFirst
Do Until MyRs.EOF
MyRs.Delete
MyRs.MoveNext 'ここでエラーとなります。
Loop
を考えるに
Delete しても実際には削除フラッグのようなものが立って
いるだけのような雰囲気ですね。
もしレコードが存在しないのなら、Current Recordの位置はどこになるのでしょう。
削除したレコードの次?
なら、その後で MoveNext してるのでレコードは飛び飛びに削除されてよさそうな。
削除したレコードの前?
なら、最初のレコードを削除した場合にどこが Currentになるのでしょう。
なのでどのタイミングかは不明ですがある段階まではAccess内部で記憶していると
考えてもよさそうです。
で、この記憶領域が不足したのかな?と。

削除クエリで行えませんか。
Currentdb.Execute("delete * from table where ○=" & forms!▽!□)
みたいな感じで。

この回答への補足

早速ご検討頂き有難う御座います。

うまくいく時は、全行削除されており、飛び飛び削除状態にはなっておりません。
うまくいかない時は、下の方の1-2行を残した状態となっていました。
削除クエリーの場合、サブフォームに#Deletedと表示されて見た目が悪く、フォームの再表示が必要になるので、この方法をトライしました。

今回、レコードセットオブジェクト変数をDAO.Recordsetと宣言しましたが、対象となるレコードセットが、データベースではなく、サブフォームに属するプロパティーでしたので、DAO.をはずし、Recordsetのみにして確認したところ、エラーが起こらなくなりました。このような区別があるのでしょうか?当面これで様子をみてみたいと思います。

補足日時:2013/08/21 10:27
    • good
    • 0

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