• 締切済み

アクセス帳票フォームのループ処理ができない

いつもお世話になっています。 win7,Access2010 です。 帳票フォーム上にいくつかの連結フィールドがあり、A,B,Cとします。 Aには初期値が入力されています。 Bに1レコードづつ値を入力し、すべてのレコードに入力し終わった後に、 全レコードにおいて、A-Bの値をCに代入したいのです。 以下のようなコードを書きましたが、 カレントフィールドにのみ適用されます。 一括で全レコードに適用するためには、 どうすればいいのでしょうか? よろしくお願いします。 Private Sub コマンド71_Click() Dim rs As Recordset Set rs = Me.Recordset.Clone rs.MoveFirst Do Until rs.EOF Me!C = A - B rs.MoveNext Loop rs.Close MsgBox "計算が終了しました" End Sub

みんなの回答

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.4

No3 です。 余計なコメントマークが付いていました。 > 'rs.Update > ADO と異なり、Update しないと、変更がキャンセルされます。  rs.Update  ADO と異なり、Update しないと、変更がキャンセルされます。

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.3

添削とちょっとだけ解説 Private Sub コマンド71_Click() ' Dim rs As Recordset  Dim rs As DAO.Recordset ' 参照設定によっては ADO の Recordset とみなされ、型不一致のエラーになる。 ' 明示的に DAO の Recordset と宣言しましょう。 ' Set rs = Me.Recordset.Clone  Set rs = Me.RecordsetClone RecordsetClone なら Recordset に加えられた変更が すぐに フォームに反映します。 rs.MoveFirst Do Until rs.EOF ' Me!C = A - B  rs.Edit   ADO と異なり、レコードを編集する場合、 その前に Edit メソッド が必要です。  rs!C = rs!A - rs!B  レコードの内容で計算し、フィールドに書き込みます。  RecordsetClone の ポインタを変えても  フォームのカレント行は変わりません。 '' Me!C = A - B  は フォームの現在のレコードで、 コントロールの値の代入を しているだけです。  フォームで、移動していないので、カレント行だけ繰り返し同じ処理をするのみです。  'rs.Update  ADO と異なり、Update しないと、変更がキャンセルされます。    rs.MoveNext Loop rs.Close MsgBox "計算が終了しました" End Sub フォームの Recordset、 RecordsetClone、 Recordset.Clone の違いを ヘルプ等でご確認ください。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

ゴメンね。  (またまた、未確認だけど、、、) じゃあ、movenext前に、formをrefresh するとどうだろう。 (きっと、処理が遅くはなるよね。) というか、本来は ・B入力時にCも入れてしまうか ・更新クエリで一発処理すべき じゃないだろうか?

nzmssk
質問者

お礼

なるほど、そうですね。 クエリでの処理の方がいいですね。 勉強になりました、ありがとうございます。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

movenextの前で rs.updateとか。

nzmssk
質問者

お礼

ありがとうございます。 updateまたはcancel updateメソッドには、対応するadd newまたはeditメソッドが必要です。 とエラーがでます。 引き続きよろしくお願いします。

関連するQ&A