これまでで一番「情けなかったとき」はいつですか?

月間スケジュールテーブルを新規生成するルーチンです
月初~月末まで各日にちの曜日を[曜日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
他にお気づきの点はご指導ください

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/05 16:48

> これは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 …

の様に、命令の比較はあります

クエリ等で行えない複雑な処理などを行う際には使用することがありますが、基本的にはクエリ等の標準機能で行えるものは、全般的にDAO、ADOより高速に稼動するので、クエリ等を使用したほうが宜しいかと思います

私の場合はAccess97の名残でDAOを使用していることが多いですが、ネット上ではADOの方をよく見かけるかな?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/06 10:06

> 月間スケジュールテーブルを新規生成するルーチンです


よく判らないのですが、フォームのレコードを移動させてデータを書込みしているのでしょうか?

If Me.CurrentRecord = Me.Recordset.RecordCount Then
MsgBox ("最後のレコード")
ElseIf Me.NewRecord Then
MsgBox ("新規のレコード")
End If

で、最後のレコードは見つかります
Recordset等のEOFは、Bookmarkを使用して同じレコードに移動する必要があったと思います

しかし、データを更新などを行うには、効率的には、お勧めできない方法です
・更新クエリ
・ADO、DAOの使用
を使ったほうが宜しいかと^^;
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/05 17:08

>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」を指定しています。

この回答への補足

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

補足日時:2007/07/07 10:32
    • good
    • 0
この回答へのお礼

詳細なご指導ありがとうございます。
皆様のおかげで、自分では納得のいくシステムが完成しました。

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

PCはVALUESTAR VH300/7Aです

お礼日時:2007/07/07 10:16

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:'エラーの場合はここへ来ます
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/07 10:22

Accessは最近触ってないのでうそかもしれませんが



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

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

お礼日時:2007/07/07 10:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A