• 締切済み

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

いつもお世話になっています。 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% (295/459)
回答No.4

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

  • m3_maki
  • ベストアンサー率64% (295/459)
回答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

  • Access VBA フォームに表示したい

    Access2000で、帳票フォームにSQLの値を表示させたいのですが、 以下のコードだとフォーム上に最後のレコードしか表示されません。 取得したデータを正しく表示するにはどうしたらよいでしょうか。 ・フォームのtext1のコントロールソースにfld1と書く 以外の方法でできますか? できればすべて非連結で、作成したいです。 (本当はフォームのrecordsourceも設定したくないのですが それは無理でしょうか?) よろしくお願いいたします。 Private Sub Form_Load() Dim conn As Connection Dim rs As ADODB.Recordset Dim strSql As String Set conn = CurrentProject.Connection Set rs = New ADODB.Recordset strSql = "select * from table1" rs.Open strSql, conn, adOpenKeyset, adLockOptimistic, adCmdText Me.RecordSource = strSql rs.MoveFirst Do Until rs.EOF me!text1 = rs!fld1 rs.MoveNext Loop rs.Close Set rs = Nothing conn.Close Set connn = Nothing End Sub

  • アクセスのフォームで10件づつ表示する。

    初めて書き込みさせて頂きます。 アクセスのテーブルを帳票形式にて作成して10件づつ表示をさせようとすると一部のデータが表示されません。 方法としては、帳票形式で10件のみ表示出来る様にサイズを調整して「前へ」と「次へ」のボタンをつけて10件づつ表示させています。 ソースは下記の方法で 「次へ」 Private Sub コマンド13_Click() Dim rs As DAO.Recordset, i As Integer Const n As Integer = 10 Set rs = Me.RecordsetClone For i = 1 To n * 2 If rs.EOF Then rs.MoveLast Me.Bookmark = rs.Bookmark Exit Sub End If rs.MoveNext Next Me.Bookmark = rs.Bookmark For i = 1 To n rs.MovePrevious Next Me.Bookmark = rs.Bookmark rs.Close End Sub 「前へ」 Private Sub コマンド16_Click() Dim rs As DAO.Recordset, i As Integer Const n As Integer = 10 Set rs = Me.RecordsetClone For i = 1 To n * 2 If rs.BOF Then rs.MoveFirst Me.Bookmark = rs.Bookmark Exit Sub End If rs.MovePrevious Next Me.Bookmark = rs.Bookmark For i = 1 To n rs.MoveNext Next Me.Bookmark = rs.Bookmark rs.Close End Sub 以上、ご教授の程宜しくお願い致します。

  • 困っていますよろしくお願いします。

    困っていますよろしくお願いします。 やりたいことなのですが、accessテーブルのレコードをカレントレコードと次のレコードと言ったように1レコードずつ比較して、すべてのフィールド値が2つのレコード間で同じであればレコードの削除、1つでも値がちがえば削除しないと言うプログラムを組みたいと思っています。(2つのレコードの各フィールドの値を比較し違いがあればそのレコードを残したいので別テーブルへの追加でもかまいません) 下記のプログラムのようにDLookup関数を使用し"商品"のように1フィールドであれば次のレコードとの比較が可能なのですが、DLookup関数を使って複数フィールドを次のレコードと比較することが出来るのでしょうか? また、出来ないのであればほかにどのような比較方法があるのでしょうかお助けくださいよろしくお願いします。(IDフィールドはオートナンバーです) Dim a As String Dim b As String Dim c As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "T_履歴", cn, adOpenKeyset, adLockOptimistic rs.MoveFirst a = rs!ID Do Until rs.EOF b = DLookup("商品", "T_履歴", "ID = " & a) c = DLookup("商品", "T_履歴", "ID = " & a + 1) If b = c Then rs.Delete Else rs.Delete rs.MoveNext End If a = a + 1 rs.MoveNext Loop rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing

  • アクセス2013MoveNextでエラーになります

    Me.Recordset.MoveFirst i = 1 While (Not Me.Recordset.EOF) Me.フィールド = i i = i + 1 Me.Recordset.MoveNext Wend >Me.Recordset.MoveNext ここで、アクセス2010ではエラーになりませんが、アクセス2013でエラーになります。 > i = i + 1 この箇所にブレークポイントを入れて1回1回ストップ、再実行させるとエラーになりません。 なぜでしょう?対処法がありましたらご教授を。

  • Accessのフォーム操作について

    Accessの帳票フォーム上で、ある特定の条件に当てはまるレコードの特定のコントロールを非表示にする方法はありませんでしょうか? 例えば、A,B,Cというフィールドがあって、AがNull値ならそのレコードのCコントロールを非表示にしたいのですがどうやってもうまく行きません。 条件があてはまるレコードのみの特定のコントロールを非表示にし、レコードの表示はあくまでフィルタを掛けずに全件表示でなくてはいけないという制約がありまして困っております。 これって不可能でしょうか? どなたかお知恵をお貸し下さい。

  • ACCESS ADOのMovePreviousについて

    毎度お世話になっております。 ACCESS2003を使用しています。 ACCESS ADOにて、レコードセットがeofになった後、 MovePreviousをし、MoveNextをし、 さらにもう一度MovePreviousをすると、 最終レコードの一つ前に戻ってしまいます。 テーブル1 フィールド1 フィールド2    1     あ    2     い    3     う    4     え    5     お コード Sub test()   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Set cn = CurrentProject.Connection   rs.Open "select * from テーブル1 order by フィールド1", cn, adOpenDynamic, adLockReadOnly   Do Until rs.EOF    rs.MoveNext   Loop   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.MoveNext   rs.MovePrevious   Debug.Print rs.Fields("フィールド1").Value   rs.Close: Set rs = Nothing   cn.Close: Set cn = Nothing End Sub 一度目のdebug.printは5に、 二度目のdebug.printは4になります。 このような仕組みなのでしょうか。 ご教授お願いいたします。

  • 異なるフォームに属する関数間でACCESSのレコードセットを受け渡しする。

    msAccess2000のVBAコードの質問です。 元々、全てを理解しているわけではないのにVBAコードを書いているのが無茶なんですが、無茶を承知でプログラミングしています。 あるクエリの結果を、あるフォームで帳票表示しています。この帳票の一レコードにボタンをつけて、クリックイベントで、そのレコードを取得しようとしています。フォームはこの後、閉じられた後、呼び出された親にその、レコードを渡したいのです。 フォームは、親フォームのボタンクリックイベントから、DoCmd.Openformメソッドによって呼び出されるので、戻り値は使えません。 しょうがないので、広域変数rst(DAO.Recordset型)で、受け渡そうと思ったのですが、recordset型は、どうやら参照のようで、フォーム(クエリ?)を閉じると、レコードが壊れてしまうようなのです。 Module1で、 public rst as DAO.recordset として、 Private Sub コマンド34_Click() set Module1.rst=me.recordset ' この中では、rst.fields(*)で、フィールドの値を使えるのですが・・・ END Sub 呼び出した親フォームでは、module1.rst.fields(*)を使用できません。 質問は二つあります。 1)広域変数rstは、上記のような宣言・使用法で問題ないですか? 2)sub またはfunction間にわたって、レコードを渡す、いい方法はないですか?

  • ループ処理の繰り返しについて

    お世話になっております。 単純なことで悩んでおります、どなたかわかるかたお願いいたします。 <% DO UNTIL SQLrs.EOF IF a=0 THEN %> 処理1 <% END IF SQLrs.MOVENEXT LOOP %> <% SQLrs.MOVEFIRST DO UNTIL SQLrs.EOF IF b=0 THEN %> 処理2 <% END IF SQLrs.MOVENEXT LOOP %> 上記のような処理順なのですが、問題は MoveFirstで先頭のレコードにもどらないのか、2回目のループ処理がうまく抽出できません。 原因はわかりますでしょうか?

  • (アクセス)レコードの値を順番に取得したい

    フォームのビューが「帳票フォーム」で Sub test1() MsgBox Form_sqlのフォーム.タイトル End Sub を実行すると 一番最初のレコードの値が取得できるのですが 2行目、3行目を取得するにはどうすればいいでしょう? ADOを使って rs.MoveNext をするしかないでしょうか? よろしくお願いします。

  • テーブルのレコードが0件時にmsg表示(アクセス)

    とてつもない初歩的な質問で すみません! フォーム1をメニュー画面として、 フォーム1にある「ボタン」を押すと テーブルにレコードが追加され、処理が走る・・・という仕様を作っています。 ですが、 このテーブルにレコードが追加されなかった=0件 の場合の回避策を どうしたら良いのかが わかりません。 ちなみに、 Private Sub ボタン_Click() On Error GoTo errmsg DoCmd.SetWarnings False Dim DB As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Long Set DB = CurrentDb Set rs1 = DB.OpenRecordset("テーブル1") Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF If rs1!フィールドA1 = rs1!フィールドA2 Then rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = rs1!フィールドA1 rs2!B = rs1!フィールドB rs2!C = rs1!フィールドC rs2.Update End If If rs1!フィールドA1 < rs1!フィールドA2 Then For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1 rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = i rs2!フィールドB = rs1!フィールドB rs2!フィールドC = rs1!フィールドC rs2.Update Next i End If rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing DB.Close: Set DB = Nothing Call 次処理 errmsg: MsgBox "元データが未投入です。" End Sub としたのですが、 これでは データが投入され、処理が成功=完了した場合にも エラーメッセージが出てしまいました。 ご教示いただけますと幸いです。 お手数をおかけしますが、よろしくお願い致します。

専門家に質問してみよう