- 締切済み
アクセス帳票フォームのループ処理ができない
いつもお世話になっています。 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
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- m3_maki
- ベストアンサー率64% (296/460)
No3 です。 余計なコメントマークが付いていました。 > 'rs.Update > ADO と異なり、Update しないと、変更がキャンセルされます。 rs.Update ADO と異なり、Update しないと、変更がキャンセルされます。
- m3_maki
- ベストアンサー率64% (296/460)
添削とちょっとだけ解説 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)
ゴメンね。 (またまた、未確認だけど、、、) じゃあ、movenext前に、formをrefresh するとどうだろう。 (きっと、処理が遅くはなるよね。) というか、本来は ・B入力時にCも入れてしまうか ・更新クエリで一発処理すべき じゃないだろうか?
- ShowMeHow
- ベストアンサー率28% (1424/5027)
movenextの前で rs.updateとか。
お礼
ありがとうございます。 updateまたはcancel updateメソッドには、対応するadd newまたはeditメソッドが必要です。 とエラーがでます。 引き続きよろしくお願いします。
お礼
なるほど、そうですね。 クエリでの処理の方がいいですね。 勉強になりました、ありがとうございます。