• ベストアンサー

ACCESSテーブルを RecordSet以外で1レコードづつ読む方法

Set inrec3 = CurrentDb.OpenRecordset("テーブル名") でオープンして1レコードづつ読みたいのですが 上記の方法では、データが多いため(2万件ちょっと) フリーズしてしまいます そこでもっと単純にOpenする方法はないでしょうか テキストファイルのオープンだと 今度は、フィールドの取り出しがやっかいかな と思うのですが よろしくおねがいします

  • maaaa
  • お礼率91% (330/362)

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

  • ベストアンサー
回答No.1

久しぶりにDAOを使ってみたので外しているかもしれませんが Sub aaa() Dim db As Database Dim inrec3 As DAO.Recordset Dim i As Long Set db = CurrentDb Set inrec3 = db.OpenRecordset("TEST") Do Until inrec3.EOF i = i + 1 If i Mod 100 = 0 Then Debug.Print i, inrec3!XXX DoEvents If i = 30000 Then Exit Sub End If inrec3.MoveNext Loop inrec3.Close Set inrec3 = Nothing Set db = Nothing End Sub 試しにやってみました。 200万件のレコードで30,000回ループ 何も問題ありませんでした。 気になったことですが、 (1)Set inrec3 = CurrentDb.OpenRecordset("テーブル名") とせずに、"Select * From テーブル名 Where Field1 > 1000 " 見たいに SQL文でくくれないでしょうか。 全レコードを読まなければならないのならば別ですが (2)DoEventsを入れて見たらどうでしょうか。

maaaa
質問者

お礼

回答ありがとうございました 試みてみます

その他の回答 (1)

noname#22222
noname#22222
回答No.2

質問自体に疑義があります。 そもそも、2万件のレコードセットをオープンしたらフリーズするようでいたらデータベースアプリケーションが組めないと思いますが? ということは、原因はレコードセット以外にあるのではと思われますが...

maaaa
質問者

お礼

回答ありがとうございます ご指摘のとおり、フリーズはなおりました 原因がわからないうちにできてしまって  理由は書けませんが ありがとうございました

関連するQ&A

  • テーブル内のレコードを別のテーブルに移す良い方法を教えてください

    SQLサーバー7.0(ADO)とAccess97のVBAでアプリケーションの開発を行っております。SQLサーバー7.0(サーバー側)にあるテーブルの中身(レコード全件)をAccess97(ローカル)にあるテーブル(テーブル名とその中のフィールド名は全く同じだが中身はからっぽ)にまとめて移しかえる良い方法があれば教えてください。いま私はフォームオープンイベントでフィールドとレコードをループでまわして移しかえているのですが、テーブル数も多いため記述も長くなりますし、何よりもパフォーマンスが良くありません。テーブル単位で中身を別のテーブルに移す方法などがあれば是非教えてください。 (例) SQLサーバー(ホスト側)---テーブル名「T_社員マスター」フィールド数100項目、レコード数500件 ↓ ↓ フォームオープン時にそのまま移しかえたい ↓ ↓ Access97(端末側)-------テーブル名「T_社員マスター」フィールド数100項目、レコード数0件 よろしくお願いします。

  • ACCESS テーブルのレコードを全て移動

    ACCESS VBA を使って処理を行っております。 原因が分からず困っております。 結果テーブル  フィールド名 monoID,monona,inkosuu,outkosuu,nowkosuu 取込テーブル  フィールド名 物ID,物名,現在個数 今までフォームに表示させて一件づつ手入力にて処理しておりましたが、複数人で作業できるように修正している所です。 ○各々がExcelに収集したデータをCSVにて「取込テーブル」にインポート   ↓ ○「取込テーブル」のレコードを集約しデータ整合(ここまでは出来ています)   ↓  ○「取込テーブル」の全レコードを「結果テーブル」にインポート DIM SQL001 AS String SQL001 = "INSERT INTO 結果テーブル (monoID,monona,nowkosuu) SELECT (取込テーブル.物ID,取込テーブル.物名,取込テーブル.現在個数) FROM 取込テーブル CurrentDb.Execute SQL001 これで動作させるとエラーになります。 ただ、実験で SQL001 = "INSERT INTO 結果テーブル (monoID) SELECT (取込テーブル.物ID) FROM 取込テーブル の様に一つのフィールドだけにすると全てのレコードをインポートすることが出来ます。 何か凡ミスの様な気もするのですが、取込テーブルをレコードセットとし1件ずつインポートする方法しか無いのでしょうか?

  • レコード件数が返らない理由がわからない

    テーブル1にはレコードが5件入ってるのですが Private Sub レコード件数() Dim strSQL As String Dim rs As DAO.Recordset strSQL = "SELECT * FROM テーブル1;" Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) Debug.Print rs.RecordCount End Sub これをすると1が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?

  • アクセス2000(ADO)のレコード更新について

    1件しかレコードがない[リスト連番T]テーブルのレコードを読みだして、(フィールド)リストNOをプラス1して更新したいです。 DOAが混ざっているのか、下記のようにエラーがでます。プラス1して更新する正しいプログラムを教えて下さい。 Private Sub リスト_Click() Dim DBS As Databasu Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Intejer Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset,adLockOptimistic, adCmdTableDirect LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing Set DBS = CurrentDb Set RST = DBS.OpenRecordset("リスト連番T") With RST -----.Edit で コンパイルエラー-----   メソッドまたはデータメンバーがみつかりません .Edit !リストNO = LISTNO + 1 .Update .Close

  • accessで選択クエリで得た全レコードをテーブルに取り込む方法

    選択クエリを実行して得たレコードを全てテーブルに移したいのですが、簡単な方法を教えて下さい。最初からクエリをテーブル作成クエリにする方法以外にありますか?出来ればテーブル(フィールドはもちろんクエリで得たレコードと同じ)はすでに作成済みでそのテーブルに上書きしたいのですが・・・ よろしくお願いいたします!

  • ACCESS2000でテーブルをVBAからテーブルを読み込む方法

    ACCESS2000を使っています。 以下の指定をした場合、「ユーザ定義型は定義されていません」のメッセージが出て、コンパイルが通りません。 なにかインストールや設定が必要なのでしょうか? Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("テーブル名", dbopendynaset) ヘルプ等を自分なりに参照してみたのですが、わかりません。教えてください。

  • レコードセットに新規追加する

    Access2013 VBAで ■テーブルa ・id ・名前 ・id2 とあり このテーブルのレコードセットを以下のように作ります。 dim Rec = dao.Recordset Set Db = CurrentDB set Rec = Db.OpenRecordset("Select * from [テーブルa] where id2 = " & 2, dbOpenDynaset) この時、このテーブルにid2=2のレコードが何もない場合、この生成したRecで、 Rec.AddNew Rec.Fields("名前").value = "名前" Rec.Update と出来ますでしょうか? よろしくお願いします。

  • Accessでの新規レコードの追加の方法

    Windows XP上でMicrosoft Access 2000を使用しています。 オートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加したいのですが、クエリやそれを基にしたフォームを介した方法はもちろんのこと、テーブルをデータシートビューで表示した状態でも追加することができません。 例えばレコードセレクタからレコード追加を選んでレコード保存を選んでも追加されません。 このテーブルに別のフィールドを追加してデータを入れるとレコードの追加が可能なのですが、オートナンバー型フィールド1つのみではうまくいきません。 どなたかオートナンバー型フィールド1つのみを含むテーブルに新規レコードを追加する方法を御存知でしたら御教示下さいませ。

  • テーブルのレコードが0件時にmsg表示(アクセス)

    とてつもない初歩的な質問で すみません! フォーム1をメニュー画面として、 フォーム1にある「ボタン」を押すと テーブルにレコードが追加され、処理が走る・・・という仕様を作っています。 ですが、 このテーブルにレコードが追加されなかった=0件 の場合の回避策を どうしたら良いのかが わかりません。 ちなみに、 Private Sub ボタン_Click() On Error GoTo errmsg DoCmd.SetWarnings False Dim DB As DAO.Database Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Dim i As Long Set DB = CurrentDb Set rs1 = DB.OpenRecordset("テーブル1") Set rs2 = DB.OpenRecordset("テーブル2", dbOpenDynaset) rs1.MoveFirst Do Until rs1.EOF If rs1!フィールドA1 = rs1!フィールドA2 Then rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = rs1!フィールドA1 rs2!B = rs1!フィールドB rs2!C = rs1!フィールドC rs2.Update End If If rs1!フィールドA1 < rs1!フィールドA2 Then For i = rs1!フィールドA1 To rs1!フィールドA2 Step 1 rs2.AddNew rs2!ID = rs1!ID rs2!フィールドA = i rs2!フィールドB = rs1!フィールドB rs2!フィールドC = rs1!フィールドC rs2.Update Next i End If rs1.MoveNext Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing DB.Close: Set DB = Nothing Call 次処理 errmsg: MsgBox "元データが未投入です。" End Sub としたのですが、 これでは データが投入され、処理が成功=完了した場合にも エラーメッセージが出てしまいました。 ご教示いただけますと幸いです。 お手数をおかけしますが、よろしくお願い致します。

  • Recordset参照の記述方法

    WindowXP、ACCESS2003、を使っています SQLを使ってRecordsetを使う場合 (要点だけをCodingします) テーブル;TblAのフィールド:id, aa, ab、があるとして Set RS=OpenRecordset("SELECT * From TblA") とした時、RS!aaでフィールドaaを参照できます Debug.Print "RS=" & RS!aa さてテーブルを2つ使った場合 どう参照するかわからないでいます 例えば Set RS=OpenRecordset("SELECT TblA.id, TblB.bb From TblA INNER JOIN TblB ON TblA.id = TblB.id;") 但し テーブル;TblAのフィールド:id, aa, ab、 テーブル;TblBのフィールド:id, ba, bb、 を想定しています この時 bb、を参照するのに Debug.Print "RS=" RS!FileB.bb ではおかしいし Debug.Print "RS=" RS!bb ではTblA,TblB、のどちらのフィールドかわかりません (今はbb、はTblBにしかないのでわかりますが) 質問点はこれをどう記述するのか知りたいのですが よろしくお願いします