• ベストアンサー

アクセスのフォームで連動したコンボボックスの絞りこみ速度を速める方法はないでしょうか?

Access2003を使用しています。 フォームでユーザーNOコントロールボックスでユーザを選ぶと、商品番号コントロールボックスにはそのユーザーが所有する商品番号だけを絞り込んで表示するように設定しました。(QNo.3477730で質問) ですが、商品番号コントロールボックスのプルダウンをクリックしてから、商品番号が表示されるまでに5秒近くかかってしまいます。 これは、妥当な所要時間でしょうか? 私としては、1秒ぐらいに縮めたいのですが方法はないでしょうか? 他のユーザの商品も含めて商品数は1600件あります。 PCのメモリは260MB RAMです。 テーブルの商品番号のプロパティのインデックスは、はい(重複あり)になっております。 こうすればもう少し時間を短く出来る方法がありましたら教えていただけないでしょうか。

  • 375k
  • お礼率60% (176/289)

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

  • ベストアンサー
noname#140971
noname#140971
回答No.3

先の回答の際に私が作成したテストテーブルは次のようです。 少し、長くなりますが、問題解決のヒントにはなるかと思います。 顧客マスター: ユーザーNo___氏名 _____________1___鈴木 一郎 _____________2___中村 主水 商品マスター: 商品番号____品名 ___________1___商品A ___________2___商品B 顧客商品管理: ID___ユーザーNo_____商品番号 1____鈴木 一郎_______商品A 2____鈴木 一郎_______商品B 3____中村 主水_______商品A もちろん、<顧客商品管理>の実際のデータは次のようです。 1_______________1__________________________1 2_______________1__________________________2 3_______________2__________________________1 次にテストしたのは、<ユーザーNo=1>が所有する商品の品名のリストを検索すること。 [イミディエイトウインドウ] ? DBSelect("SELECT 商品マスター.品名                FROM 顧客商品管理                INNER JOIN 商品マスター                ON 顧客商品管理.[商品番号]=商品マスター.商品番号                WHERE 顧客商品管理.[ユーザーNo]=1;") 商品A;商品B 確かに、<商品A;商品B>をセミコロン(;)で区切って抜き出しています。 ならば、 ユーザ番号_AfterUpdate() で次のように書けば、目的は達成します。 Private Sub ユーザ番号_AfterUpdate()   Dim strQuerySQL As String   strQuerySQL = "SELECT 商品マスター.品名              FROM 顧客商品管理              INNER JOIN 商品マスター              ON 顧客商品管理.[商品番号]=商品マスター.商品番号              WHERE 顧客商品管理.[ユーザーNo]=" & Me.ユーザ番号   Me.コンボ_ユーザ所有商品名一覧.RowSource = DBSelect(strQuerySQL)   Me.コンボ_ユーザ所有商品名一覧.Value = Me.コンボ_ユーザ所有商品名一覧.ItemData(0) End Sub 先の回答では、このテスト内容は一切示していません。 しかし、質問文から、上述のようなテーブル構造になっているのか一抹の不安を覚えていました。 また、クエリにフォームを条件として組み込めば実行速度が大幅に低下するとも思っていました。 確かに、それは簡単に実現できる手法かも知れません。 が、クエリも所詮は SQL文。 ならば、VBA で直接に値リストを設定するのが手っ取り早いと思います。 SQL文自体は、クエリで作成すればいいです。 実際、上述のSQL文もクエリで作成しています。 もちろん、DBSelect関数は最速ではありません。 DAOでINDEXとSEEKを使えば、もっと、高速化します。 が、いずれにしろ 0.01秒以下の世界の話で、どっちでもいいのじゃないですかね。 Public Function DBSelect(ByVal strQuerySQL As String, _              Optional ByVal strSeparator As String = ";") As String On Error GoTo Err_DBSelect   Dim I   As Integer   Dim J   As Integer   Dim R   As Integer   Dim C   As Integer   Dim M   As Integer   Dim N   As Integer   Dim rst  As ADODB.Recordset   Dim fld  As ADODB.Field   Dim Datas As String      Set rst = New ADODB.Recordset   ' =================   ' Begin With: rst   ' -----------------   With rst      .Open strQuerySQL, _         CurrentProject.Connection, _         adOpenStatic, _         adLockReadOnly      If Not .BOF Then       M = .RecordCount - 1       N = .Fields.Count - 1       .MoveFirst       For R = 0 To M         For C = 0 To N           Datas = Datas & .Fields(C) & strSeparator         Next C         .MoveNext       Next R      End If   End With   ' ---------------   ' End With: rst   ' =============== Exit_DBSelect:   DBSelect = Left(Datas, Len(Datas) + (Len(Datas) > 0))   Exit Function Err_DBSelect:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBSelect)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBSelect End Function

その他の回答 (2)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

たかがレコード数1600で5秒は考えられないです 1秒でも長すぎます PCのスペックなんかの問題ではなく作り方に問題があるのでしょうね それを詳しく説明してみれば

noname#60992
noname#60992
回答No.1

>ユーザーが所有している商品番号は、商品リストと顧客名簿というテーブルを連結させたクエリで出来上がっています。 これから推測すると、顧客名簿に商品番号を入れるところがあるようですね。 1ユーザーが複数商品を保有する場合のデータの登録方法がどうなっているのかわかりませんが、顧客名簿の商品番号も、インデックスは、はい(重複あり)にすると良いと思います。 あとは最適化を行ってみること。 それで改善しなければ、他のスペックのPCで動かしてみて、改善があるか調べてみることくらいかな。

関連するQ&A

  • アクセスのフォームのコンボボックスに表示させる対象をユーザーNo. で絞りたいのですが、どうすればよいでしょうか?

    Access2003を使用しています。 フォームに配したコンボボックスのことで教えてください。 フォームには、ユーザーNoを入れるテキストボックスがあります。 その下にはユーザーが所有している商品番号を入れるコンボボックスがあります。 ユーザーナンバーを手打ちで入力すると、商品番号のコンボボックスにはそのユーザーが所有している番号だけが表示されるようにしたいのです(商品番号は1000個ぐらいあります)。 ユーザーが所有している商品番号は、商品リストと顧客名簿というテーブルを連結させたクエリで出来上がっています。 どのようにしたらよいのでしょうか? ご教示をお願いいたします。

  • accessのコンボボックスについて

    質問があります。下記のようなテーブルがあります。 ▼商品情報テーブル  ・商品ID (番号はオート。キー)  ・商品番号(自社で設定している商品ごとの番号)  ・商品名 これを「受注伝票」フォームに使用します。 商品番号をコンボボックスで指定すると 商品名が別のテキストボックスに自動で表示。 もし登録されていない商品の場合には 商品番号と商品名をその場で登録して商品情報テーブルに反映させたい。 コンボボックスで選択する際はID順ではなく、 商品番号の昇順で並び替えたいと思います。 商品番号は数値ではなくテキストになっています。 弊社では「i0001、i0002...」のように、商品番号の頭に「i」が付くからです。 ACCESSのバージョンは2002です。 どうぞよろしくお願いいたします。

  • コンボボックスの連動

    こんにちは! 今回もVBAで分からないことがあったため、質問させて頂きます。 Excelは2003を使用しています。 画像のようなデータが、A1:D?まであったとします。 A列、B列、C列などの重複しないデータをプログラムを用いて 同じシート内(例として、「管理」シートとします。)に記載しています。 そのデータをコンボボックス上に表示することはできました。 そして、次にコンボボックス上に表示されたデータを選択した際に、 フィルターで絞込みをするように設定しています。 (図の例でいくと、りんごで絞込み) 「りんご」で絞込みをかけた際に、実際のリスト上にある 重複しないデータをコンボボックスに入れなおしたい?です。 重複しないデータの抽出方法が悪いとは思うのですが、 可視セル(指定列)の重複しないものを書くことはできるのでしょうか? たぶん、重複しないデータを抽出する際の 範囲指定が悪いと思います。 色々書いてわからなくなったため、 やりたいことをまとめさせて頂きます。 ●コンボボックスを押した際にフィルター絞込み(これは出来てます) ●絞り込んだ後、その他の列の重複しないデータをコンボボックスに入れなおす あと別途、 ●可視セル(タイトル行を除く)の範囲選択&データ取得方法(重複しないデータ取得も) ●フィルターをかけた際に、絞込み結果が0(空白)の場合、メッセージボックスを表示 情報不足かもしれませんが、回答よろしくお願い致します。 EndLineは、A1から下に下がった行番号を格納しています。(例)9 ---------------------------------------------- On Error Resume Next 'データを登録する間、エラーを無視する For i = 2 To EndLine '最終行までチェック Mydata.Add Range("B" & i).Value, Range("B" & i).Value '名前の列の重複確認 Next i On Error GoTo 0 '重複していないデータがMydataに格納されていく For Each A In Mydata 'Mydataの内容をセルに書き出す。 Worksheets("管理").Cells(i, ROW_NUMBER).Value = A i = i + 1 Next A End Function ------------------------------------------------- Function Combo_KOUSIN() 'コンボボックスのデータ更新 Dim EndLine As Long Dim i As Long ComboBox1.Clear EndLine = EndCheck("F") ' ”F” 列の行数抽出 For i = 1 To EndLine ComboBox1.AddItem Range("F" & i).Value Next 上と同様に、combobox2,3,4も行う。 F列、G列、H列、I列などに重複しないデータがあります。 それを取得して、ComboBoxに格納します。

  • Accessのコンボボックスについて・・・

    こんにちは、Accessのフォームにコンボボックスを設置して、以下のような事ができないかと悩んでおります。よろしくお願い致します。 フォーム内には、部署名・氏名・住所・商品名など、クエリの列名をテキストボックスにて設置してあります。 フォーム内に別の(客先名専用)クエリでコンボボックスを設置し、コントロールソースには会社名を選択しています。 フォームビューでそのコンボボックスからひとつの会社名を選択すると、別の(客先名専用)クエリからでも、フォーム内にあるテキストボックス名と同じ列名であればテキストボックスに表示が可能ではないかと思っています。が、現在の状態だとコントロールソースで選択した会社名のみの表示だけです。どこかで設定する機能があるのか難しいVBでの設定しかないのか、それもわかりません。是非、この方法がおわかりになられる方ご教示下さいます様お願い致します。わかりずらい説明で申し訳ございませんが、よろしくお願い致します。

  • ACCESS2000でのActiveXのコンボボックスの使い方について

    ACCESS2000で、今まで使用していたコンボボックスをActiveXコントロール(Microsoft Forms2.0)のコンボボックスに変更しようとしています。今までは値集合ソースでクエリを使って「商品名」「商品コード」を表示させ、選択後に商品コードを取得して、他で利用しています。 これをActiveXコントロールでは、どのように行ったらよいのでしょう? アドバイスをどうか、よろしくお願いします。

  • MSのACCESSで、コンボボックスを連動して検索

    例えば、第一段階で大きなテーブルの商品グループを選択し、次に、選択されたグループ内の商品をコンボボックスで表示し選択する方法を、実現したいのですが、解り易い資料等はありますでしょうか?

  • ユーザーフォーム上にあるコンボボックスの重複選択をできなくするには?

    ユーザーフォーム上に10個のコンボボックスがあり それぞれ名前をcb1からcb10とします。 これらのコンボボックスには同じリストを取得して 表示していますが、選択するときには重複させないように したいと思っています。 例を挙げると、 リストの値が”東京”、”大阪”、”名古屋”として、 cb1で”東京”を選択している場合は、残りのcb2~cb10では ”東京”を選択できないように、もしくは選択したときに ”すでに選択済みです”みたいなメッセージを表示させて キャンセル状態に戻す、みたいにしたいのですが スマートな書き方がわかりません。 ※力業でそれぞれのコンボボックスのチェンジイベントで 他のコンボボックスの値を見に行って、重複があれば メッセージを表示させるという方法ならわかるのですが 実際のコンボボックスの数が50近くあるためできれば 避けたいと思っています。 達人の皆様、どうぞ宜しくお願いします。

  • オフィスアクセスのコンボボックスについて

     オフィスアクセスのコンボボックスについて質問いたします。  課テーブルと係テーブルがあり、それぞれで課番号が共通しています。 フォームでそれぞれをコントロールソースにして、コンボボックスを配置しています。  課テーブルのコンボボックスでCを選んだ時、係テーブルのコンボボックスに表示されるのをC_1だけにしたいと考えています。  このようにするには、どのような設定を行えばよろしいのでしょうか? ご教示のほど、よろしくお願いいたします。

  • Accessのコンボボックスの使い方について

    初心者です。 コンボボックスの使い方について教えて下さい。 商品テーブルA 商品名|コードA|コードB|コードC| マスターテーブル A|B|商品名|コードA|コードB|コードC|D|E のような2つのテーブルを作成し、マスターテーブルの「商品名」に コンボボックスで商品テーブルAの商品名を表示させるとします。 そこでコンボボックスで商品名を選択すると同時に 商品テーブルAからほかの「コードA」「コードB」「コードC」の値を マスターテーブルの「コードA」「コードB」「コードC」に入れる方法は ありますでしょうか? また、他の方法はありますでしょうか? 宜しくお願い致します。

  • 2つのプルダウンボックスの連動について

    <SELECT><OPTION></OPTION></SELECT>タグで作るプルダウンボックスについて質問です。 AとBの二つのプルダウンボックスを設置し、Aで選択された項目に合わせて、Bの表示項目を変更させたいと思っています。 この2つのプルダウンボックスを連動させる方法について、JAVAスクリプトを使った方法を知りましたが、利用者がブラウザでJAVAを切っていた場合は正常に機能しないのでしょうか? 利用者がブラウザでJAVAを切っていた場合にも対応できる連動の方法があればぜひ教えてください。

    • ベストアンサー
    • HTML