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

いつもお世話になっています。
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

A 回答 (4件)

No3 です。


余計なコメントマークが付いていました。

> 'rs.Update
> ADO と異なり、Update しないと、変更がキャンセルされます。

 rs.Update
 ADO と異なり、Update しないと、変更がキャンセルされます。
    • good
    • 0

添削とちょっとだけ解説



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 の違いを
ヘルプ等でご確認ください。
    • good
    • 0

ゴメンね。

 
(またまた、未確認だけど、、、)
じゃあ、movenext前に、formをrefresh するとどうだろう。
(きっと、処理が遅くはなるよね。)

というか、本来は
・B入力時にCも入れてしまうか
・更新クエリで一発処理すべき
じゃないだろうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/06/02 08:13

movenextの前で


rs.updateとか。
    • good
    • 0
この回答へのお礼

ありがとうございます。

updateまたはcancel updateメソッドには、対応するadd newまたはeditメソッドが必要です。

とエラーがでます。

引き続きよろしくお願いします。

お礼日時:2012/06/01 15:02

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A