Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2010)
レコードの削除ができなくなる
投稿日時: 20/02/17 16:14:56
投稿者: やま3

サブフォームのあるフォームのサブフォームのレコードを選択し
 
Sub M_200100C()
    DoCmd.RunCommand acCmdDeleteRecord
End
を実行するとレコードが削除されます
 
ところが、特定条件の時だけ上記を行いたいので
その条件を特定するマクロを先に動かして
 
例えば
Sub M_200100C()
  Dim C件数 As Long
  DoCmd.RunMacro "M_A"
  
 IF C件数>0 THEN  
    DoCmd.RunCommand acCmdDeleteRecord
  ENDIF
  'ステップ毎に実施しC件数をウォッチングしましたが0より大きい数字となっています
 
End Sub
とするとフォームが固まってしまい動きません
 
マクロの最後はこのフォームとは関係ないテーブルのレコードの全削除と追加です
そしてこのテーブルの件数をC件数に取得し0より大きい場合のみ
DoCmd.RunCommand acCmdDeleteRecord
で削除したいのです
どのようにすればよいかご教示ください
 
 
 
 
 

回答
投稿日時: 20/02/17 17:21:14
投稿者: sk

引用:
ところが、特定条件の時だけ上記を行いたいので
その条件を特定するマクロを先に動かして

引用:
DoCmd.RunMacro "M_A"

マクロ[M_A]において、具体的にどのようなアクションを
実行されているのかが不明です。
 
引用:
Dim C件数 As Long

引用:
IF C件数>0 THEN  
  DoCmd.RunCommand acCmdDeleteRecord
ENDIF
'ステップ毎に実施しC件数をウォッチングしましたが0より大きい数字となっています

もし本当にこの通りに記述されているとすれば
変数[C件数]の値は初期値の 0 のままであるはずです。

投稿日時: 20/02/17 17:31:50
投稿者: やま3

早速の回答ありがとうございます
 
「サブフォームのあるフォームのサブフォームのレコードを選択し 」
をVBAで行う方法をご教示ください
 
C件数は本システムではテーブルのレコード件数は1件なので
1になっています・・・・こだわりません

回答
投稿日時: 20/02/17 17:47:09
投稿者: sk

引用:
「サブフォームのあるフォームのサブフォームのレコードを選択し 」
をVBAで行う方法をご教示ください

サブフォームのどのレコードを選択なさりたいのでしょうか。
 
その処理の目的が「ある条件に該当するレコードの削除」なのであれば、
まずはその具体的な条件を明示されることをお奨めします。
 
引用:
C件数は本システムではテーブルのレコード件数は1件なので
1になっています・・・・こだわりません

変数[C件数]に何らかの数値を代入するコードが実行されていない限り、
その値が 0 以外になることはあり得ません。

投稿日時: 20/02/18 09:17:43
投稿者: やま3

いつもありがとうございます
説明不足で申し訳ございません
 
まずマクロはサブフォームの中のフィールドの更新後のイベントプロシジャーで実行しています
 
       DoCmd.RunMacro "M_A30?e???i???o"
 
そのプロシジャー内で上記マクロで作成されたテーブルのレコード件数をDCOUNTで取得し、変数[C件数]に格納します
その変数が0以上ならそのフィールドのレコードそのものを削除したいのです
 
IF C件数 > 0 THEN
     
      DoCmd.RunCommand acCmdDeleteRecord
    
End If
 
以上を更新後のイベントプロシジャーで実行したいのですが
マクロ終了後のカレントレコードに問題があるのか、その他の問題で
IF文が実行されません・・・その後固まります
 
ちなみにIF文をなくしても、てDoCmd.RunCommand acCmdDeleteRecordは実行するようにしても動きません
・・同じく固まります
 
 
 

回答
投稿日時: 20/02/18 13:37:52
投稿者: sk

引用:
マクロはサブフォームの中のフィールドの更新後のイベントプロシジャーで実行

引用:
そのプロシジャー内で上記マクロで作成されたテーブルのレコード件数を
DCOUNTで取得し、変数[C件数]に格納します
その変数が0以上ならそのフィールドのレコードそのものを削除したいのです

引用:
DoCmd.RunCommand acCmdDeleteRecord

つまり「サブフォームのカレントレコードを削除したい」
ということですね。
 
引用:
マクロ終了後のカレントレコードに問題があるのか、その他の問題で
IF文が実行されません・・・その後固まります

If 文のステップに到達していないのであれば、
それ以前に実行されているコードの問題。
 
引用:
ちなみにIF文をなくしても、
DoCmd.RunCommand acCmdDeleteRecord
は実行するようにしても動きません

「RunCommand メソッドを呼び出すステップに到達はしているが、
[レコードの削除]コマンドを実行できない」ということであれば、
通常はその時点で何らかの実行時エラーが発生するはず。
 
いずれにせよ、最初の投稿で示されたのは実際のコードではないようですので、
まずは以下のような記述が含まれていないかどうかをご確認下さい。
 
・エラートラップの設定
 
・DoCmd.SetWarnings メソッドの呼び出し

投稿日時: 20/02/18 14:23:01
投稿者: やま3

いろいろご指導ありがとうございました
発想を変えて、マクロ分の中にIF文を作成し、条件に該当した場合マクロのレコード削除を実行
するようにに、更新後処理にこのマクロそのものを登録すれば解決しました
 
イベントプロシジャとその中でのVBAにこだわり過ぎました