• ベストアンサー

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 他にお気づきの点はご指導ください

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

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.3

こんにちは。 これかな~ DoCmd.GoToRecord acForm, "マスタFORM", acFirst 'Do While Not EOF(1) 'ここでエラーが発生します Do While マスタFORM.NewRecord = False   If 曜日No. = 曜日TMP Then     '追加RTN 'レコードの追加ルーチンです   End If   DoCmd.GoToRecord acDataForm, "マスタFORM", acNext Loop

shinkami
質問者

お礼

ご回答ありがとうございます。 DoCmd.GoToRecord acdataForm, "マスタFORM", acFirst Do While Forms!マスタFORM.NewRecord = False で、解決しました。

その他の回答 (5)

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.6

> これはACCESS2000の機能でしょうか、環境の追加が必要でしょうか > 調べれば分かるでしょうが、今一度助言頂けないでしょうか DAO(Data Access Objects)は、Access97以前の標準で使用されていたデータベースへアクセスするための手続き命令です ADO(ActiveX Data Objects)は、Access2000より採用されたデータベースへアクセスするための手続き命令です ADOは、DAOの後継として開発発表されました、ローカルをベースに考慮されていたDAOをネット上で使用することを前提に開発されたものがADOと言うのが私の認識です(OLEからActiveXへ以降したのと同じようなもの) 基本的にAccess2000以降では、DAO、ADOともに使用可能です (DAOは、参照設定をする必要が別にあったと思いましたが・・・) DAO から ADO への移植 - MSDN (Microsoft) http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado.aspx の様に、命令の比較はあります クエリ等で行えない複雑な処理などを行う際には使用することがありますが、基本的にはクエリ等の標準機能で行えるものは、全般的にDAO、ADOより高速に稼動するので、クエリ等を使用したほうが宜しいかと思います 私の場合はAccess97の名残でDAOを使用していることが多いですが、ネット上ではADOの方をよく見かけるかな?

shinkami
質問者

お礼

有難うございます。 サイト似ましたが、独習では難しそうですね

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.5

> 月間スケジュールテーブルを新規生成するルーチンです よく判らないのですが、フォームのレコードを移動させてデータを書込みしているのでしょうか? If Me.CurrentRecord = Me.Recordset.RecordCount Then MsgBox ("最後のレコード") ElseIf Me.NewRecord Then MsgBox ("新規のレコード") End If で、最後のレコードは見つかります Recordset等のEOFは、Bookmarkを使用して同じレコードに移動する必要があったと思います しかし、データを更新などを行うには、効率的には、お勧めできない方法です ・更新クエリ ・ADO、DAOの使用 を使ったほうが宜しいかと^^;

shinkami
質問者

お礼

ご回答感謝します。 ・ADO、DAOの使用は未体験です。 これはACCESS2000の機能でしょうか、環境の追加が必要でしょうか 調べれば分かるでしょうが、今一度助言頂けないでしょうか

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.4

>Do While Not EOF(1) ‘ここでエラーが発生します エラーが出て当たり前。「1番」のファイル番号はオープンされていません。 以下、EOF関数の例、その1 Open "FILE01" For Input As #1 Open "FILE03" For Input As #2 Open "MYFILE" For Input As #4 If EOF(1) Then Exit Sub ' "FILE01"が終端 If EOF(4) Then Exit Sub ' "MYFILE"が終端 If EOF(2) Then Exit Sub ' "FILE03"が終端 Close #1 Close #2 Close #4 以下、EOF関数の例、その2 Dim InputData Open "MYFILE" For Input As #1 ' ファイル番号「1番」をシーケンシャル入力モードで開きます。 Do While Not EOF(1) ' ファイル番号1番のファイルが終端かどうかを確認します。   Line Input #1, InputData ' ファイル番号1番からデータ行を読み込みます。   Debug.Print InputData ' イミディエイト ウィンドウに表示します。 Loop Close #1 ' ファイル番号1番を閉じます。 テーブルに関連付けされたフォームを最初から最後まで移動するのはデータの抜け落ちが発生したりして危険だし、フォームを使用する意味がありません。 もし、フォームの方にフィルタや並べ替えが設定してあり、特定のデータが出て来ないようになっていたり、データが1件も出て来ないようになっていたら「データがあるのにデータが無いと思って処理される」ので、何が起きるか判りません。 それに、フォームのレコード移動は、移動のたびに画面が再描画され、処理が重くなり過ぎます。 もし当方がチームリーダーで、チーム内にそういう書き方をするメンバーが居たら、すぐに作り直しさせます。 テーブルを1レコードづつ順に処理するなら、以下のようにテーブルを直接操作し、フォームを用いてはいけません。  Dim dbs As Database, rst As Recordset  ' カレントデータベースへの参照を取得します。  Set dbs = CurrentDb  ' 週間計画テーブルのレコードセットを開きます。  Set rst = dbs.OpenRecordset("週間計画テーブル")  ' ファイルの最後まで実行します。  Do Until rst.EOF   If rst.Fields("曜日No.").Value = 曜日TMP Then    追加RTN 'マスタFROMを参照しないように変更したルーチンであること   End If   ' 次のレコードに移動します。   rst.MoveNext  Loop  rst.Close 'rstを開放  Set dbs = Nothing 'dbsを開放 以下蛇足。 >DoCmd.GoToRecord acForm, "マスタFORM", acFirst >DoCmd.GoToRecord acDataForm, "マスタFORM", acNext 次レコード移動では正しく「acDataForm」を指定しているのに、先頭への移動では間違って「acForm」を指定しています。

shinkami
質問者

お礼

詳細なご指導ありがとうございます。 皆様のおかげで、自分では納得のいくシステムが完成しました。 処理スピードですが 4名の週間データ(56件)を月のスケジュールデータへ展開しました所(253件)、30秒程度です。 変化するテキス項目を表示しないとすると7秒と大幅に短縮されました。 このシステムを使用する事業所は利用者が50名程度です。 所要時間とデータ量は単純には比例しないと思いますが 7秒×50名÷4名=88秒 2分程度で1ヶ月のスケジュールが出来れば合格ですよね ご指導の詳細は今後学習してVERSION2に反映させて戴きます。 PCはVALUESTAR VH300/7Aです

shinkami
質問者

補足

最終レコードの判定は Do While Forms!マスタFORM.NewRecord = False としてパスしました

  • fly_moon
  • ベストアンサー率20% (213/1046)
回答No.2

EOFの書き方だけなら EOF(1)→ Forms.マスタFORM.Recordset.EOF でコンパイルは通りますが、エラーが発生するでしょうね。 条件を記述しないでエラーで抜ける方法もあります。 Do'----------------------------<<無限ループ>> On Error GoTo Exit_do If 曜日No. = 曜日TMP Then 追加RTN ’レコードの追加ルーチンです End If DoCmd.GoToRecord acDataForm, "マスタFORM", acNext Loop'---------------------------- Exit_do:'エラーの場合はここへ来ます

shinkami
質問者

お礼

ご回答有難うございます。 EOF(!) ()内の意味を取り違えていました 皆様のおかげでシステムは完成しました

  • ArukuMail
  • ベストアンサー率22% (115/510)
回答No.1

Accessは最近触ってないのでうそかもしれませんが >>Do While Not EOF(1) このEOF(1)って何に対してのEOFです? 書かれているフォームの動作内容としたらおそらく ・マスタFORMをオープン ・マスタFORMの最初のレコードに移動  ↓ ・マスタFORMの次のレコードに移動 ってなかんじだと思います これだと間接的にDBをいじっているだけなので (人間が画面を開いて帳票入力している操作をわざわざPGでやっている気がする) 登録されているレコード数と現在のレコード位置を把握しないといけない 気がします。マスタFORM.CurrentRecordとかマスタFORM.MaxRecord系かな?

shinkami
質問者

お礼

ご回答有難うございます。 EOF(!) ()内 ファイルを開いた時に設定したファイルNo.ですね まったく意味を取り違えてました 皆様のおかげでシステムは完成しました

関連するQ&A

  • レコード移動について

    単票フォームで何件かレコードがあります。 それを 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サブフォームのレコード移動

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

  • VBAに「maqBox」を追加したい

    検索結果フォーム「未来」を開くフォーム「マスター」に配した、コマンドボタンのイベントに下記の記述「OKWaveで過去にアドバイス頂いた」をしています。この記述に「("指定したレコードはありません")」を表示させたいと思います。WEBを参照したりしてやってみましたが上手く出来ませんでした。 ツール:Access2007 フォーム名:未来 Private Sub コマンド27_Click() If Me.CurrentRecord < Me.Recordset.RecordCount Then DoCmd.GoToRecord acDataForm, Me.Name, acNext End If End Sub [やってみたこと「VBA知識なし」] Private Sub コマンド27_Click() If Me.CurrentRecord < Me.Recordset.RecordCount Then DoCmd.GoToRecord acDataForm, Me.Name, acNext End If   MsgBox ("指定したレコードはありません") End Sub 上記の書込だと検索結果のレコードの数だけ移動時にメッセージが出る。 以上ですが、宜しくお願いします。

  • 実行時エラー 3020の対策

    アクセス2003で次のエラーが発生します。 実行時エラー 3020 Update または CancelUpdateメソッドには、対応するAddNewまたはEditメソッドが必要です。 以下のソースは、「テスト」フォームにtestフィールドがある簡単なデータベースですが、全レコードを最初から最後までtestフィールドの先頭に"abc "を付加するというものです。 Public Sub Test() Dim form_name as String Dim frmObj As Form Dim rstObj As Recordset Dim fld_dat As String form_name = "テスト" DoCmd.OpenForm form_name Set frmObj = Application.Forms(form_name) Set rstObj = frmObj.Recordset '先頭のレコードに移動する DoCmd.GoToRecord acDataForm, form_name, acFirst Do fld_dat = rstObj.Fields("test").Value fld_dat = "abc " & fld_dat rstObj.Fields("test").Value = fld_dat '<--- *** ここでエラー *** '次のレコード DoCmd.GoToRecord acDataForm, form_name, acNext DoEvents Loop While frmObj.NewRecord = False End Sub

  • アクセスの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

  • 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

  • GoToRecordでサブフォームを指定したい

    Fフォームの中にSF詳細という名前のサブフォームを埋め込んでいます。 このサブフォームに対して、 指定したレコードに移動したいのですが DoCmd.GoToRecord acDataForm, Form_SF詳細, acGoTo, 3 DoCmd.GoToRecord acDataForm, Forms("Fフォーム").Controls("SF詳細").Form, acGoTo, 3 DoCmd.GoToRecord acDataForm, "SF詳細", acGoTo, 3 全部エラーになり、うまくいきません。 正しい記述の仕方を教えてください。

  • Access2003はチューニングは可能ですか?

    以下のように、レコード1件ずつ処理させるVBAをAccess2003で書いているのですが、処理が遅いです。(1件ずつなので当たり前ですが・・・) AccessやWindows2000をチューニングして、早くすることは可能でしょうか? 基本的にCPUやメモリの増設は金欠のため考えておりません。 あと、開始から終了までミリ単位で計測するVBAの書き方も知りたいです。   '開始 '先頭のレコードに移動する DoCmd.GoToRecord , , acFirst Do '処理 ' ... '次のレコード DoCmd.GoToRecord , , acNext Loop While Me.NewRecord = False   '終了

  • アクセス enterで次ページ(レコード)移動

    アクセスでformを使い最後の入力”失効有無”が終わったら次のレコードにenter keyで 移動したいのですがうまくいきません。 プロパティの更新後処理 イベントプロシージャのところに下記を書いています。 Private Sub 失効有無_AfterUpdate() DoCmd.GoToRecord , , acNewRec DoCmd.GoToControl "ID" 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 一連の流れについて,ご解説ください。よろしくお願いいたします。

専門家に質問してみよう