パススルークエリのデータ件数取得について

このQ&Aのポイント
  • ACCESS2003、SQLSERVER2000でパススルークエリを使用しています。
  • パススルークエリPQ1の実行時間が約7秒かかっており、件数と特定の列の件数をフォームに表示したい。
  • DCount関数を使って件数を取得しているが、実行時間が4倍になってしまう。なるべく高速化したい。
回答を見る
  • ベストアンサー

パススルークエリのデータ件数の取得について

ACCESS2003、SQLSERVER2000を使用しています。 パススルークエリPQ1を作成し、リストボックスのRowSourceにしています。 PQ1はサブクエリを多用しまくっているためか、 結果が返ってくるのに7秒くらいかかっています。 PQ1の件数と、 PQ1の列[可否]の中にある'○'、'×'の件数をフォーム上の テキストボックスに表示したいのです。 Me.txt件数.Value = DCount("*", "PQ1") Me.txt丸件数.Value = DCount("*", "PQ1", "可否 = '○'") Me.txt罰件数.Value = DCount("*", "PQ1", "可否 = '×'") としたところ、約4倍の時間がかかるようになってしまいました (その都度パススルークエリが実行されているのでしょうか)。 なるべく時間がかからないようにしたいのです。 よろしくお願いします。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

パススルークエリは毎回実行しにいくと思います。 そのクエリは時間がかかるとわかっているならば、対応策は限られます。 1)パススルークエリを諦めて、一旦ローカルのテーブルに落とす 2)一旦DBの別テーブルに結果を押しこんでから、パススルークエリをそちらに投げる 3)リストボックスの中身を数える  リストボックスを1列増やして、「可否」もリストボックスに入れてしまい(列幅ゼロ)、あとは.Column(c,r)の中身をループでカウントするだけです。 でも、クエリは再実行されないのでそんなにかからないと思います。

tokonoko
質問者

補足

回答ありがとうございます。 3)リストボックスの中身を数える の方法で、1回実行したときと変わらない時間で 実行することができました。 ありがとうございました。

関連するQ&A

  • Accessのフォームで値が見た目変更されない

    はじめまして、こんにちは。 Accessを使用して自社ツールを作成しています。 バージョン:Access2003 OS:WindowsXP フォームのレコードソースに、あるテーブルを連結させて一覧にして表示しています。 複数のコンボボックスを用意して、選択された値によって検索をかけ、 レコードソースの値を書き換えて再表示しています。 この検索はコンボボックスの更新後処理にVBAでSQLを記述して行っています。 Dim str_sql As String str_sql = str_sql & "select * from T_テーブルA where ○○コード = 1" Me.RecordSource = str_sql かなり省略していますが、実際はコンボボックスで選択された値によって SQLを生成しています。 フォームにはtxt_件数という名前でテキストボックスを用意してあります。 レコードソースを設定した後に、同じ条件でカウントし件数を表示しようと しているのですが、これがうまくいきません。 Me!txt_件数 = Nz(DCount("*", "T_テーブルA", "○○コード = 1"), 0) 件数が1件でもある時は正しい値が表示されます。 0件の場合は前回の表示のまま見た目上かわりません。 例) 1回目の検索で200件→テキストボックス[200]と表示 2回目の検索で0件→テキストボックス[200]と表示 3回目の検索で10件→テキストボックス[10]と表示 このような感じです。 ただし、実際は正しい値[0]が設定されているみたいです。 別のウインドウを一度フォームにかぶせて避けると[0]になりますし、、 2回目で[200]と表示されているものをコピーすると[0]がコピーされます。 Me!txt_件数 = Nz(DCount("*", "T_テーブルA", "○○コード = 1"), 0) If Me!txt_件数 = 0 Then Me!txt_件数 = 0 End If 馬鹿げていますが、このようにしても正しく[0]が表示されませんでした。 Accessを再起動しても状態は変わらず、困っています。 環境の問題でしょうか? 解決策など解る方いらっしゃいましたら教えてください。 よろしくお願いいたします。

  • パススルークエリをテーブル作成するには?

    以下のコードについてお教えいただければと思います。 フォーム上のテキストボックスに入力された6ケタの年月に基づき、 パススルークエリでデータ抽出を行うつもりです。 この後に、新たにテーブル作成をしようと思っています。 しかし、以下のコードでは (1) 書き込むTestテーブルを準備し、保存しておく必要があるかと思います。 (現在は、別に作ったクエリオブジェクトの形式を流用しています) (2) 繰り返し数が多く、相当な時間を使います。 (3) Loopの代わりにと、SQLでINTO~を挿入したらエラーになってしまいます。 Testテーブルを都度削除し、一回で全件を追加する方法はないでしょうか。 Private Sub PassThru() Dim qd As QueryDef Dim rsSub As DAO.Recordset, rsMain As DAO.Recordset Dim str月初 As String, str月末 As String Dim i As Long Const strConnect As String = "ODBC;****" Set dbs = CurrentDb Set qd = dbs.CreateQueryDef("") qd.Connect = strConnect qd.ReturnsRecords = True str月初 = Format(DateSerial(Left(Me.txt年月, 4), Right(Me.txt年月, 2), 1), "yyyymmdd")) str月末 = Format(DateSerial(Left(Me.txt年月, 4), Right(Me.txt年月, 2) + 1, 0), "yyyymmdd") qd.SQL = "SELECT * FROM MAINDATA WHERE((DATE>=" & str月初 & ") And (DATE<=" & str月末 & "))" Set rsSub = qd.OpenRecordset()   '****テーブルへの書き込み。フィールド数(20)×レコード数(約1500)回まわる DoCmd.RunSQL "delete * from Test"   Set rsMain = dbs.OpenRecordset(Name:="Test", Type:=dbOpenTable) Do Until rsSub.EOF For i = 0 To rsSub.Fields.Count - 1 rsMain.AddNew rsMain.Fields(i)=rsSub.Fields(i)    Next Loop End Sub

  • ExcelUserForm,Txtデータを列取得

    Txtファイルにあるデータがコンマで区切られています。並びをAからJとします。Aの前には日付が入っています。複数のテキストファイルを持ちいります。 ExcelのUserFormを使い、テキスト(拡張子Txt)のデータを列ごと取得しようと思っております。たとえば図のようにBのチェックボックスにチェックを入れ、ExecuteButton1を押すと「-509999.9987」データと日付のみ、新しいExcelファイルにデータを入れるという方法です。 並びとしましてUserForm1の中にPage1がありその中にFrame1が入って、Checkboxがあります。 テキストオープン>新規のExcelシートを作成する>選択したタグを列で取得する>新規のExcelシートに取得したデータを詰めて張り付ける(その時日付とデータを張り付ける)。 たとえばチックボックス1と4にチェックが入っていたとします。コンマの間と間のデータを取得しようとすると、1列目のデータは日付なので、2列目と5列目を取得したいと思いますがうまくいきません。  チェックボックスの1番目にレ点があると下記のようになります。 If Me.Controls("CheckBox1").Value = True Then If Me.Controls("CheckBox2").Value = True Then If Me.Controls("CheckBox3").Value = True Then して行くと、200以上のチェックボックスがある場合それを200以上作らないといけません。 また、下記のようにすると。 ....................... For i = 1 To 200 If Me.Controls("CheckBox" & i).Value = True Then ~~~~~~~~~ else ~~~~~~~~~ next i .......................... たとえば1と4列目が正(True)の場合であっても、テキストの中身のデータを的確に2列目と5列目を取得するのが難しいです。 どなたか簡単にできる方法を教えていただけますでしょうか。どうぞよろしくお願いいたします。

  • Excel ユーザーフォームでコンボボックスを使用してデータ入力

    Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。 コンボボックス:ComboBox1 テキストボックス1-3:TextBox1-3 コンボボックスのRowSource:シート名!A2:C100 コンボボックスの変更時の動作: Me!TextBox1.Value = ComboBox1.Value とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、 どのようにしたらいいのでしょうか?

  • リストボックスにシートの値を表示させたいのですが

    vbaでシートのリストボックスにシートの値を表示させたいのですが シートモジュールでこのコードを実行しようとしてもエラーになり出来ないのですが どこが間違ってますか? Sub リストボックスに値を表示する() Me.ListBox1.RowSource = Range("c1:c10").Value End Sub Me.ListBox1.Value = Range("c1:c10").Value もエラーになりました。

  • ExcelのUserForm,Txtデータを列取得

    Txtファイルにあるデータがコンマで区切られています。並びをAからJとします。Aの前には日付が入っています。複数のテキストファイルを持ちいります。 ExcelのUserFormを使い、テキスト(拡張子Txt)のデータを列ごと取得しようと思っております。たとえば図のようにBのチェックボックスにチェックを入れ、ExecuteButton1を押すと「-509999.9987」データと日付のみ、新しいExcelファイルにデータを入れるという方法です。 並びとしましてUserForm1の中にPage1がありその中にFrame1が入って、Checkboxがあります。 Executeボタンを押したら、下記のような流れになればいいです。 テキストオープン>新規のExcelシートを作成する>選択したタグを列で取得する>新規のExcelシートに取得したデータを詰めて張り付ける(その時日付とデータを張り付ける)。 たとえばチックボックス1と4にチェックが入っていたとします。コンマの間と間のデータを取得しようとすると、1列目のデータは日付なので、2列目と5列目を取得したいと思いますがうまくいきません。  チェックボックスの1番目にレ点があると下記のようになります。 If Me.Controls("CheckBox1").Value = True Then If Me.Controls("CheckBox2").Value = True Then If Me.Controls("CheckBox3").Value = True Then して行くと、200以上のチェックボックスがある場合それを200以上作らないといけません。 また、下記のようにすると。 ....................... For i = 1 To 200 If Me.Controls("CheckBox" & i).Value = True Then ~~~~~~~~~ else ~~~~~~~~~ next i .......................... たとえば1と4列目が正(True)の場合であっても、テキストの中身のデータを的確に2列目と5列目を取得するのが難しいです。 どなたか簡単にできる方法を教えていただけますでしょうか。どうぞよろしくお願いいたします。

  • ACCESS VBA リストの規定値

    フォームにテキストボックス(txt商品条件、txt金額条件)とリストボックス(lst結果)があり、 txt商品条件を満たす物をlst結果に表示させ、 lst結果に表示された中で、txt金額条件を満たす物を選択された状態にしたいのですがどうしたらいいでしょうか? lst結果にtxt商品条件を満たす物を表示させることはできたのですが、 ---------- Me!lst結果.RowSource="SELECT * FROM 商品" _ &"WHERE 商品グループ'" & Me!txt商品条件 & "'" Me!lst結果.Requery ---------- txt金額条件を満たす物を選択状態にする方法がわかりません。どのようにしたらいいのでしょうか?

  • エクセル VBA if構文

    毎度お世話になります。 下記プログラミングですが、 シャーペンまたはボールペンがコンボボックス1で 選択された場合はコンボボックス2で10束または50束の選択肢となり 消しゴムまたはシャー芯がコンボボックス2で 選択された場合はコンボボックス2で100コまたは1000コの選択肢としたいのですが 他の方法がありますでしょうか。 宜しくお願い致します。 If Me.ComboBox1.Value = "シャーペン" Or Me.ComboBox1.Value = "ボールペン" Then ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "" ComboBox2.Clear ComboBox2.AddItem "10束" ComboBox2.AddItem "50束" ComboBox2.ListIndex = -1 End If If Me.ComboBox1.Value = "消しゴム" Or Me.ComboBox1.Value = "シャー芯" Then ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "" ComboBox2.Clear ComboBox2.AddItem "100コ" ComboBox2.AddItem "1000コ" ComboBox2.ListIndex = -1 End If

  • VBA Do…Loopについて

    お世話になっております。 ただいま、アクセスVBAにてDo…Loopの練習をしております。 テキストボックス1に数字を入れ、コマンドボタンを押すと入力した数字が1ずつ引かれる形でテキストボックス2に入るようにしたいです。 (テキストボックス1に「8」→テキストボックス2に「87654321」のように) Dim I As Variant I = Me.text1.Value Me.text2.Value = Me.text1.Value Do Until I = 1 I = I - 1 Me.text2.Value = Me.txt2.Value & I Loop で動作そのものはするのですが、doloop前の「Me.text2.Value = Me.text1.Value」を正さないといけないようです。(課題です) これがないと入力された数字そのものが入らなくなってしまうのですが… よろしくおねがいします。

  • vba ユーザーフォームについて

    勉強のためにvb勉強中です。エクセルのユーザーフォームについて質問です。 コンボボックス 01 02 のどちらかを選択すると、テキストに入力した数字は、01を選択したら11行、02を選択したら12行に転記できるようにしたいのですが、if文を使うのだろうと思うのですが、教えていただけないでしょうか。 私が途中まで作成した載せておきます。よろしくお願い申し上げます。 Private Sub CommandButton1_Click() Dim rc As Long Dim retu As Long Dim Ctrl As Control If Me.txtComboBox1.Value = "" Then MsgBox "社員名を選択してください!", vbOKOnly Me.txtComboBox1.SetFocus Exit Sub End If rc = MsgBox("件数を入力しますか?", vbYesNo) If rc = vbYes Then MsgBox "実行する" Else MsgBox "中止しました" Exit Sub End If retu = Cells(3, Columns.Count).End(xlToLeft).Column + 1 Cells(3, retu).Value = Me.txtComboBox1.Value ←社員を選択 Cells(4, retu).Value = Me.txtsuzuki.Value  ←売れた件数 Cells(5, retu).Value = Me.txttoyota.Value  ←売れた件数 Cells(6, retu).Value = Me.txthonnda.Value   ←売れた件数 For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next Ctrl End Sub また、テキストボックスに数字だけ入力して、プルダウン選択してないとエラ~メッセージも出るようにしたいです...