- ベストアンサー
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 他にお気づきの点はご指導ください
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 これかな~ 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
その他の回答 (5)
- Dxak
- ベストアンサー率34% (510/1465)
> これは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の方をよく見かけるかな?
お礼
有難うございます。 サイト似ましたが、独習では難しそうですね
- Dxak
- ベストアンサー率34% (510/1465)
> 月間スケジュールテーブルを新規生成するルーチンです よく判らないのですが、フォームのレコードを移動させてデータを書込みしているのでしょうか? If Me.CurrentRecord = Me.Recordset.RecordCount Then MsgBox ("最後のレコード") ElseIf Me.NewRecord Then MsgBox ("新規のレコード") End If で、最後のレコードは見つかります Recordset等のEOFは、Bookmarkを使用して同じレコードに移動する必要があったと思います しかし、データを更新などを行うには、効率的には、お勧めできない方法です ・更新クエリ ・ADO、DAOの使用 を使ったほうが宜しいかと^^;
お礼
ご回答感謝します。 ・ADO、DAOの使用は未体験です。 これはACCESS2000の機能でしょうか、環境の追加が必要でしょうか 調べれば分かるでしょうが、今一度助言頂けないでしょうか
- chie65536
- ベストアンサー率41% (2512/6032)
>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」を指定しています。
お礼
詳細なご指導ありがとうございます。 皆様のおかげで、自分では納得のいくシステムが完成しました。 処理スピードですが 4名の週間データ(56件)を月のスケジュールデータへ展開しました所(253件)、30秒程度です。 変化するテキス項目を表示しないとすると7秒と大幅に短縮されました。 このシステムを使用する事業所は利用者が50名程度です。 所要時間とデータ量は単純には比例しないと思いますが 7秒×50名÷4名=88秒 2分程度で1ヶ月のスケジュールが出来れば合格ですよね ご指導の詳細は今後学習してVERSION2に反映させて戴きます。 PCはVALUESTAR VH300/7Aです
補足
最終レコードの判定は Do While Forms!マスタFORM.NewRecord = False としてパスしました
- fly_moon
- ベストアンサー率20% (213/1046)
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:'エラーの場合はここへ来ます
お礼
ご回答有難うございます。 EOF(!) ()内の意味を取り違えていました 皆様のおかげでシステムは完成しました
- ArukuMail
- ベストアンサー率22% (115/510)
Accessは最近触ってないのでうそかもしれませんが >>Do While Not EOF(1) このEOF(1)って何に対してのEOFです? 書かれているフォームの動作内容としたらおそらく ・マスタFORMをオープン ・マスタFORMの最初のレコードに移動 ↓ ・マスタFORMの次のレコードに移動 ってなかんじだと思います これだと間接的にDBをいじっているだけなので (人間が画面を開いて帳票入力している操作をわざわざPGでやっている気がする) 登録されているレコード数と現在のレコード位置を把握しないといけない 気がします。マスタFORM.CurrentRecordとかマスタFORM.MaxRecord系かな?
お礼
ご回答有難うございます。 EOF(!) ()内 ファイルを開いた時に設定したファイルNo.ですね まったく意味を取り違えてました 皆様のおかげでシステムは完成しました
お礼
ご回答ありがとうございます。 DoCmd.GoToRecord acdataForm, "マスタFORM", acFirst Do While Forms!マスタFORM.NewRecord = False で、解決しました。