Access 最後のレコードに到達するまでループ処理を行う方法

このQ&Aのポイント
  • フォームでボタンをクリックし、計上年度と計上月をすべてのレコードに入力する方法について教えてください。
  • For~Next文でループ処理を行い、選択されているレコードが一番最初のレコードではない場合にエラーが発生します。
  • 最後のレコードに到達するまでループ処理を行う方法を教えてください。
回答を見る
  • ベストアンサー

Access 最後のレコードに到達するまでループ処理を行う方法

いつもお世話になっております。 フォームでボタンをクリックすると、 計上年度と計上月をすべてのレコードに入力させようとしています。 下記のように、For~Nextで書いてみたのですが、 選択されているレコードが、一番最初のレコードではない場合、 エラーが返ってしまいます。 おそらく「レコードの数分繰り返す」という書き方のせいだと思います。 これを「最後のレコードに到達するまで」としたいのですが、 どのように書いたらよいでしょう?? ご存知の方がいらっしゃいましたら、教えてください。 Private Sub 計上年度月入力_Click() Dim Max As Integer Dim i As Integer Max = DCount("[計上月]", "年次請求集計Q") For i = 1 To Max If 計上月 <> 0 Then DoCmd.GoToRecord , , acNext Else 計上年度2 = 計上年度1 計上月2 = 計上月1 DoCmd.GoToRecord , , acNext End If Next i End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.3

うんそれでしたら、 Private Sub 計上年度月入力_Click() Dim RecSet As Recordset Dim strSQL As String strSQL = "SELECT * FROM 請求集計T" strSQL = strSQL & " WHERE クエリの条件式"←ここを注意してください。 Set RecSet = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) RecSet.MoveFirst Do Until RecSet.eof  If 計上月 = 0 Then RecSet.Edit   RecSet.Fields("計上年度2") = 計上年度1   RecSet.Fields("計上月2") = 計上月1 RecSet.Update  End If  RecSet.MoveNext loop RecSet.close Set RecSet = Nothing End Sub ちなみに、計上年度2と計上月2はレコードフィールド、計上年度1と計上月1はフォームに配置されているテキストだと見なして作っています。

kumikoara
質問者

お礼

どうもありがとうございます! おっしゃるとおり、計上年度2と計上月2はレコードフィールド、計上年度1と計上月1はフォームに配置されています。 これだけの説明でお分かりになるとは。。。すごいですね。 (って私の説明不足ですみません。。。) で、おはずかしいですが。。。 "WHERE クエリの条件式"って何を入れたら良いのでしょう・・・? すみません。。。教えてください!!

kumikoara
質問者

補足

あ、計上年度と計上月に入力させるのは、請求集計Tのすべてのレコードを対象としてOKです。 ので、その場合はクエリの条件式は必要ないということでしょうか? その解釈でOKなら・・・ strSQL = strSQL & " WHERE クエリの条件式"←ここを注意してください。 の一文を削除して、実行してみたのですが、 RecSet.Edit のところで「メソッドまたはデータメンバが見つかりません」とのエラーが出てしまいます。 すみません。どうしてエラーが出てしまうのかわかりません。 何度も申し訳ありませんが、教えてください!!

その他の回答 (4)

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.5

たぶん、「参照設定」でDAOが設定されてません。 VBAのエディター画面で「ツール」→「参照設定」で「Microsoft DAO 3.6 Object Library」にチェックを入れてください。なお、「3.6」の所はAccessのバージョンで違いますので、「Microsoft DAO X.X Object Library」で探されてください。 ちなみ私のバージョンはAccess2000です。

kumikoara
質問者

お礼

何度もご回答いただきまして、ありがごうございました。 残念ながら、DAOの設定をしても、同じエラーが出てしまいました。 ですが、教えていただいた構文からヒントを得て、最初に書いていたFor~Nestの前に、 「DoCmd.GoToRecord , , acFirst」 を追加してみたところ、うまく動くようになりました。 本当に丁寧にご回答いただきまして、ありがとうございました。 いろいろと勉強になりました。 また、どうぞよろしくお願いいたします。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.4

う~ん、選択クエリで選択するための条件を設定されていると思うんです。選択クエリで、設定されている条件を「WHERE」句に記述すれば良いんです。 例えば、物品番号が1のものなら「物品番号=1」と書きます。さらに条件があるのなら「AND」(かつ)か「OR」(または)で繋いでいきます。 単純に日付が入っていない物であれば、「SELECT * FROM 請求集計T WHERE isnull 日付」なんて記述します。 単純に選択クエリに設定されているフィールドと条件がわかれば、一番いいんですが。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.2

年次請求集計Qって、クエリテーブルですよね? どんなクエリでしょうか?う~んそれだったらいきなりSQLに変えるのも一つの手かなぁ。 ちょっとクエリの内容がわからないので、よろしかったら教えて下さい。

kumikoara
質問者

お礼

えーっと。 「年次請求集計Q」クエリは、データを入力するフォームのために作成した選択クエリです。 って、こういう答えじゃないのカナ。。。 「年次請求集計Q」に入力したデータは「請求集計T」というテーブルに格納されます。 クエリだと問題でしたら、テーブルを見に行けば解決されるのでしょうか??? ごめんなさい。多分基本がわかってないんですね。。。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

Private Sub 計上年度月入力_Click() Dim RecSet As Recordset Set RecSet = CurrentDb.OpenRecordset("年次請求集計Q", dbOpenDynaset) RecSet.MoveFirst Do Until RecSet.eof If 計上月 = 0 Then 計上年度2 = 計上年度1 計上月2 = 計上月1 End If RecSet.MoveNext loop End Sub で出来ると思います。

kumikoara
質問者

お礼

ご回答、どうもありがとうございます! 早速、コピーして試してみたところ Set RecSet = CurrentDb.OpenRecordset("年次請求集計Q", dbOpenDynaset) のところで、エラーが出てしまいました。。。 うーむ。。どのようにしたらよいでしょう??? お手数ですが、お分かりになりましたら教えてください!!!

関連するQ&A

  • アクセスのVBEの初歩的な質問

    アクセス(に限らないとは思うのですが)のVBEを今、一生懸命勉強しているのですが、初歩的なところで、つまずいています。 あああ いいい ううう えええ 1 1 あいうえお かきくけこ 1 2 あいうえお かきくけこ 1 3 あいうえお かきくけこ 2 1 あいうえお かきくけこ 2 2 あいうえお かきくけこ 2 3 あいうえお かきくけこ 3 1 あいうえお かきくけこ 3 2 あいうえお かきくけこ 3 3 あいうえお かきくけこ というような、データを自動で入力したいのです。多分、for next と、do until あたりを組み合わせるとできると思うのですが、どうしてもうまくいきません。 とりあえず、以下のような、めちゃめちゃ効率の悪いコードを書いたのですが、もっと効率よくするには、どうしたらいいでしょうか?  ………………………………………………… Private Sub コマンド6_Click() Dim Aaa As Integer Dim Bbb As Integer Dim Ccc As String Dim Ddd As String DoCmd.GoToRecord , , acFirst Aaa = 1 Bbb = 0 Ccc = "あいうえお" Ddd = "かきくけこ" For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i Aaa = 2 Bbb = 0 For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i Aaa = 3 Bbb = 0 For i = 1 To 3 Bbb = Bbb + 1 あああ = Aaa いいい = Bbb ううう = Ccc えええ = Ddd DoCmd.GoToRecord , , acNext Next i End Sub …………………………………… ほんとうに、おはずかしいのですが、どうかご指導くださいませ。m(__)mm(__)m

  • エクセル マクロ ループ処理の構文について

    お世話になります。エクセル初心者です。 i < j の関係があるときに、それぞれの数値をfor構文でループを回したいです。 i の数値は外部から入力される前提です。 現在、以下のような構文を考えています(istartとiendは外部から決められた数値とします)が、 この場合、jendはiend + 1とすれば良いのですが、jstartはどのように入力すれば良いでしょうか? 修正箇所を指摘(もしくは全文修正)していただけると、非常に助かります。 よろしくお願いいたします。 Sub test() Dim i As Integer Dim j As Integer Dim istart As Integer Dim iend As Integer Dim jstart As Integer Dim jend As Integer istart = 1 iend = 50 For i = istart To iend For j = jstart To jend '実行したい内容 Next Next End Sub

  • レコード移動について

    単票フォームで何件かレコードがあります。 それを DoCmd.GoToRecord , , acNext で1つずつ移動させ、今何番目のデータなのか?をメッセージで出し、 最後のレコードになったら「最後のレーコード」というメッセージの後に Exit Sub させたいのですが... F8 で1つ1つコンパイルさせるとできるのですが、 データベース画面から直接フォームをDBCLして開こうとすると いきなり「最後のレコード」になってしまいます。 記述のが悪いのでしょうか?それともフォーム自体が悪いのでしょうか? 教えてください Private Sub Form_Current() If Me.CurrentRecord >= Me.RecordsetClone.RecordCount Then MsgBox "最後のレコード" Exit Sub Else MsgBox "途中のレコード" DoCmd.GoToRecord , , acNext   End If End Sub

  • access の 最終レコードの判定はどう記述しますか

    月間スケジュールテーブルを新規生成するルーチンです 月初~月末まで各日にちの曜日を[曜日TMP]に求めてこのルーチンに入ります ("マスタFORM"には週間計画のテーブルのフィールドを設定したフォームです。 (週間計画:月曜日の○○時~◎◎時に○○の作業) Private Sub 分析RTN() DoCmd.GoToRecord acForm, "マスタFORM", acFirst Do While Not EOF(1) ‘ここでエラーが発生します If 曜日No. = 曜日TMP Then 追加RTN ’レコードの追加ルーチンです End If DoCmd.GoToRecord acDataForm, "マスタFORM", acNext Loop End Sub 他にお気づきの点はご指導ください

  • Accessサブフォームのレコード移動

    Accessにおいて、サブフォームのレコードの移動方法をどなたか教えてもらえませんか。「Forms![メインフォーム名]![サブフォーム名].Form.SetFocus DoCmd.GoToRecord acDataForm, "サブフォーム名", acNext」とコーディングしたのですがダメでした。よろしくお願い致します。

  • サブフォームの新規レコードに移動したい アクセス

    親フォームのコマンドボタンをクリックしたら 親フォームにはまっているサブフォームの新規レコードに移動したいのですが、 うまくできません。 サブフォームのオブジェクト名は、"F_SubForm"です。 サブフォームはデータシートビューです。 VBAコードは Private Sub cmd_test_Click() DoCmd.SelectObject acForm, "F_SubForm" DoCmd.GoToRecord , , acNewRec End Sub です。 上記コードを実行すると DoCmd.SelectObject acForm, "F_SubForm" の部分で、 「実行時エラー 2489  オブジェクトが開いていません。」 となります。 だからと言って、 DoCmd.GoToRecord , , acNewRec だと、何も起こりません。(新規レコードに移動しません) 解決方法をご教授ください。

  • Accessで一件の新規レコードのみを登録する方法

    OS: win xp Access Version: 2003 フォームを使って新規レコード入力できるように   Private Sub Form_Load() Docmd.GoToRecord,, acNewRec End Sub として、開いています。 ここの際、問題なのですが、ホイールマウスを使っているとデータ入力中に誤ってホイールを回すことにより次の新規レコードに移ってしまいます。 これを制限したいと思います。 この類の過去で検索しましたが、解決に至っていません。 ご意見をください。

  • アクセスのVBAについて、フォームの On Error Goto についておしえてください。

    Private Sub cmd次_Click() On Error GoTo Err DoCmd.GoToRecord , , acNext Exit_Click: Exit Sub Err: MsgBox "この先にレコードがなくなると、ここをつうかするのだろうか。" Resume Exit_Click End Sub 一連の流れについて,ご解説ください。よろしくお願いいたします。

  • Accessでレコードの複製

    Access2010を使用して入力フォームを作成しています。 メインフォームとサブフォームにそれぞれ顧客情報を表示させていて、 「複製」ボタンを押すと、 メインフォーム、サブフォームのレコードがコピーされるようにしています。 メインフォームの元テーブルはJIK サブフォームの元テーブルはREN です。 JIKおよびRENテーブルはほかからリンクさせているのですが、 これで「複製」ボタンを押すと、 "実行時エラー '3022': インデックス、主キー、またはリレーションシップで重複する値が生成されるためテーブルに要求した変更でした成功しました。フィールドまたは重複データが含まれている、インデックスを削除するフィールド内のデータを変更または重複するエントリを許可して、やり直してのインデックスを再定義します。このエラーは、レポートやレポートの生成に変更を保存するときに発生します。 が出てしまいます。 テーブルをインポートすると正常に動作します。 テーブルをリンクさせる場合、レコードの複製は不可能なのでしょうか? VBAは以下のように記述してみました。 Private Sub コマンド10_Click() On Error GoTo Err_コマンド10_Click Dim Result As Integer Result = MsgBox("このデータを複製しますか?", vbYesNo + vbDefaultButton2 + vbQuestion, "データの複製確認") If Result = vbYes Then Me!txtCopy事件ID = Me!事件ID Dim stDocName As String DoCmd.RunCommand acCmdSelectRecord 'カレントレコードの選択 DoCmd.RunCommand acCmdCopy '選択レコードのコピー DoCmd.GoToRecord , , acNewRec '新規レコードに移動 DoEvents ' (必要に応じて) DoCmd.RunCommand acCmdPasteAppend 'コピーレコードの追加貼り付け DoCmd.SetWarnings False ' システムメッセージ非表示 stDocName = "追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit DoCmd.SetWarnings True ' システムメッセージ表示 ' サブフォーム再クエリ Me!SREN.Requery ' 追加したレコードに移動 DoCmd.GoToRecord , , acLast Me.リスト31.Value = Me.リスト31.ItemData(0) MsgBox ("データを複製しました") Exit_コマンド10_Click: Exit Sub Err_コマンド10_Click: MsgBox Err.Description Resume Exit_コマンド10_Click Else MsgBox "データの複製をキャンセルしました" End If End Sub 追加クエリは以下のように作成してみました。 【追加クエリ】 INSERT INTO REN ( 事件ID, 氏名, フリガナ, ・・・ ) SELECT [Forms]![MAIN]![事件ID] AS 式1, REN.氏名, REN.[フリガナ], REN.報告書, ・・・ FROM REN WHERE (((REN.事件ID)=[Forms]![MAIN]![txtCopy事件ID]));

  • 変数が勝手に変わります

    Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値 Dim expectPoint1card(5) As Integer Sub porkerGame() card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5 getExpectPoint1card expectPoint1card End Sub Sub getExpectPoint1card(expectPoint1card() As Integer) Dim tesu1 As Integer:Dim sum1 As Integer For i = 1 To 5 getTesuSum1 i, tesu1, sum1 expectPoint1card(i) = sum1 / tesu1 Next i End Sub Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer) Dim card2(5) As Integer:tesu1 = 0:sum1 = 0 MsgBox rowNumber copy card, card2, 5 MsgBox rowNumber For i = 4 To 55 MsgBox rowNumber card2(rowNumber) = i addTesuSum card2, tesu1, sum1 Next i End Sub Sub copy(row() As Integer, row2() As Integer, i2 As Integer) For i = 1 To i2 row2(i) = row(i) Next i End Sub 上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

専門家に質問してみよう