Access 最後のレコードに到達するまでループ処理を行う方法
- フォームでボタンをクリックし、計上年度と計上月をすべてのレコードに入力する方法について教えてください。
- 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
- kumikoara
- お礼率79% (73/92)
- オフィス系ソフト
- 回答数5
- ありがとう数4
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
うんそれでしたら、 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はフォームに配置されているテキストだと見なして作っています。
その他の回答 (4)
- PAPA0427
- ベストアンサー率22% (559/2488)
たぶん、「参照設定」でDAOが設定されてません。 VBAのエディター画面で「ツール」→「参照設定」で「Microsoft DAO 3.6 Object Library」にチェックを入れてください。なお、「3.6」の所はAccessのバージョンで違いますので、「Microsoft DAO X.X Object Library」で探されてください。 ちなみ私のバージョンはAccess2000です。
お礼
何度もご回答いただきまして、ありがごうございました。 残念ながら、DAOの設定をしても、同じエラーが出てしまいました。 ですが、教えていただいた構文からヒントを得て、最初に書いていたFor~Nestの前に、 「DoCmd.GoToRecord , , acFirst」 を追加してみたところ、うまく動くようになりました。 本当に丁寧にご回答いただきまして、ありがとうございました。 いろいろと勉強になりました。 また、どうぞよろしくお願いいたします。
- PAPA0427
- ベストアンサー率22% (559/2488)
う~ん、選択クエリで選択するための条件を設定されていると思うんです。選択クエリで、設定されている条件を「WHERE」句に記述すれば良いんです。 例えば、物品番号が1のものなら「物品番号=1」と書きます。さらに条件があるのなら「AND」(かつ)か「OR」(または)で繋いでいきます。 単純に日付が入っていない物であれば、「SELECT * FROM 請求集計T WHERE isnull 日付」なんて記述します。 単純に選択クエリに設定されているフィールドと条件がわかれば、一番いいんですが。
- PAPA0427
- ベストアンサー率22% (559/2488)
年次請求集計Qって、クエリテーブルですよね? どんなクエリでしょうか?う~んそれだったらいきなりSQLに変えるのも一つの手かなぁ。 ちょっとクエリの内容がわからないので、よろしかったら教えて下さい。
お礼
えーっと。 「年次請求集計Q」クエリは、データを入力するフォームのために作成した選択クエリです。 って、こういう答えじゃないのカナ。。。 「年次請求集計Q」に入力したデータは「請求集計T」というテーブルに格納されます。 クエリだと問題でしたら、テーブルを見に行けば解決されるのでしょうか??? ごめんなさい。多分基本がわかってないんですね。。。
- PAPA0427
- ベストアンサー率22% (559/2488)
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 で出来ると思います。
お礼
ご回答、どうもありがとうございます! 早速、コピーして試してみたところ 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
- 締切済み
- Visual Basic
- レコード移動について
単票フォームで何件かレコードがあります。 それを 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」とコーディングしたのですがダメでした。よろしくお願い致します。
- ベストアンサー
- Visual Basic
- サブフォームの新規レコードに移動したい アクセス
親フォームのコマンドボタンをクリックしたら 親フォームにはまっているサブフォームの新規レコードに移動したいのですが、 うまくできません。 サブフォームのオブジェクト名は、"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 として、開いています。 ここの際、問題なのですが、ホイールマウスを使っているとデータ入力中に誤ってホイールを回すことにより次の新規レコードに移ってしまいます。 これを制限したいと思います。 この類の過去で検索しましたが、解決に至っていません。 ご意見をください。
- ベストアンサー
- その他MS Office製品
- アクセスの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の値が変わるのは、どうしてでしょうか?教えてください。お願いします。
- ベストアンサー
- Visual Basic
お礼
どうもありがとうございます! おっしゃるとおり、計上年度2と計上月2はレコードフィールド、計上年度1と計上月1はフォームに配置されています。 これだけの説明でお分かりになるとは。。。すごいですね。 (って私の説明不足ですみません。。。) で、おはずかしいですが。。。 "WHERE クエリの条件式"って何を入れたら良いのでしょう・・・? すみません。。。教えてください!!
補足
あ、計上年度と計上月に入力させるのは、請求集計Tのすべてのレコードを対象としてOKです。 ので、その場合はクエリの条件式は必要ないということでしょうか? その解釈でOKなら・・・ strSQL = strSQL & " WHERE クエリの条件式"←ここを注意してください。 の一文を削除して、実行してみたのですが、 RecSet.Edit のところで「メソッドまたはデータメンバが見つかりません」とのエラーが出てしまいます。 すみません。どうしてエラーが出てしまうのかわかりません。 何度も申し訳ありませんが、教えてください!!