• 締切済み

ACCESS2010テキストボックス値を抽出条件に

ACCESS2010にて、フォームに作ったテキストボックスの入力値(数字3桁)をクエリの抽出条件にしたいと考えています。 ただ、そのテキストボックスの数が30個の為、クエリデザイン画面の抽出条件欄にorを用いた条件式で設定することが出来ませんでした。(文字数上限超?) そこで、VBAを用いて抽出条件を設定しようと考えているのですが、初心者のため全く勝手が分かりません。VBAでの設定方法やVBA以外での抽出方法があれば教えて頂けないでしょうか。 尚、テキストボックスには商品コード(数字3桁)を入力し、売上データを集計したクエリにおいて、フォームのテキストボックスに入力された複数の商品コードを抽出条件に設定したいと考えております。 以上、どうかお願い致します。

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

> 元々はチェックボックスで任意の商品を選択し、それをクエリの抽出条件としたかったのです。 この部分だけに反応しました。 VBA を使ってよいのなら以下が参考になると思います。 帳票フォーム上の非連結チェックボックスでレコードを特定したい・・・という事であれば 非連結のチェックボックスでレコードを選択する http://hatenachips.blog34.fc2.com/blog-entry-28.html ワーク用テーブルを使ってよいのならVBAは不要で、以下の#5が参考になれば (ベストアンサーではありませんが、追加クエリは不要なものです) Accessのクエリでフィールド名を追加 http://okwave.jp/qa/q7030661.html これ、クエリ上での話ですが、 ・そのクエリを元に帳票フォームを作成し、 ・「追加/削除の許可」を「いいえ」とし、 ・チェックボックス以外を編集不可 にすれば、そこそこ動くような気がします。 これらの方法であれば、上限30個等の制限はなくなるかと思います。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.4

前回回答の >リボンのクエリツールの『行の挿入』と『列の挿入』で追加できると思います。 はダメでしたかね。 問題が二手に分かれるようでちょっと回答にためらいが・・ >元々はチェックボックスで任意の商品を選択し、それをクエリの抽出条件としたかったのです。 泥臭い方法ですがテーブルにYes/No型のフィールドを追加して クエリではそのフィールドの抽出条件に yes とすれば良さそうな気もします。。 こちらの方は 1.フォームのボタンをクリック 2.フォーム内にあるテキストボックス(計30個)の値をみにいく 3.集計クエリを開く 4.クエリの商品コードの抽出条件を(2)の値とする 現状の集計クエリの SQL文を載せてもらえますか? 商品コードは数値型ですよね?

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.3

nicotinism様のご提案の方がスマートですね 商品コードだけの抽出用のテーブルを作成して クエリで 抜き出したい方 ←--------- 抽出用テーブル で結合線を引いて(抽出用テーブルの全レコードと・・・) 行うと思います。 --------以上 nicotinism 様------------- ・商品コードだけの抽出用のテーブル T_検索 ・抜き出したい方 ←- 抽出用テーブルなるクエリー作成 Q_結果 ・T_検索を基にフォーム作成 F_検索Key入力 ・F_検索Key入力にQ_結果を呼び出すコマンドを配置 これでマクロだけでVBAは要りません。 keyの数も気にすることもなく、スマートですね その他添付図で確認してください。 nicotinism様 ありがとうございました。

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

リボンのクエリツールの『行の挿入』と『列の挿入』で追加できると思います。 が 私ならテキストボックス30個は面倒なので 商品コードだけの抽出用のテーブルを作成して クエリで 抜き出したい方 ←--------- 抽出用テーブル で結合線を引いて(抽出用テーブルの全レコードと・・・) 行うと思います。 抽出用テーブルからは独立したフォームを作成するなり メインの中に埋め込むなりして 抽出条件の確定後にメインフォームをリクエリすれば? (抽出用テーブルが空っぽだとなにも表示されません) または、抽出用フォームにコマンドボタンを一個置いて そのクリック時イベントで Private Sub コマンド1_click() Forms!メインフォーム名.recordsource = "select * from テーブル名 where 商品コード In(select 商品コード From 抽出用テーブル)" End Sub などとメインフォームのレコードソースを書き換えるなどでも良さそうです。 あるいは毎回30件入力するのではない場合(通常は数件とかの抽出)なら テキストボックスを一個配置し(名前を仮に、TX1 ) そのTX1の更新後処理のVBAコードは Private Sub TX1_AfterUpdate() Dim FilterString As String Dim FilterList As String FilterList = Replace(Me!TX1, ".", ",") FilterString = "商品コード IN(" & FilterList & ")" Me.Filter = FilterString Me.FilterOn = True End Sub とします。 TX1 には、123.45.589.547.254 などとドットで区切って入力して Enter でフォームにフィルターが掛かります。 (商品コードは数値型だと仮定しています)

koube1005
質問者

補足

nicotinism様 ご回答いただき有難うございます。 私の説明が不足しておりましたので、以下に追記させて頂きます。 元々はチェックボックスで任意の商品を選択し、それをクエリの抽出条件としたかったのです。 ただ、VBAでなければ対応出来そうになく、そこでまた別にテキストボックスを作成し、チェックボックスの『更新後処理』イベントにて各々のチェックボックスに対応するテキストボックスに商品コードが入力されるイベントプロシージャを設定しました。 ここまではよかったのですが、結局このテキストボックスの値をクエリで抽出するにはVBAが必要とわかり(対象のテキストボックスが30個のため)、非常に悩んでおります。 ご回答内容も非常に参考になったのですが、VBA作成のイメージとして以下手順で行う場合にはどの様に行うべきでしょうか。 1.フォームのボタンをクリック 2.フォーム内にあるテキストボックス(計30個)の値をみにいく 3.集計クエリを開く 4.クエリの商品コードの抽出条件を(2)の値とする 以上、どうかお願い致します。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.1

VBAでやってみましょう 商品コードをキーとして作成しているクエリを Q_集計(商品コード、金額の合計)とし 出力する主キーの無いテーーブルを一つ定義します。 T_出力(コード、金額) 考え方はT_出力を初期化して テキストボックスの一つづつで抽出し、T_出力に積み上げます。 フォーム上に配置したテキストボックス名をkey1,key2,…とします。 Private Sub Form_DblClick(Cancel As Integer) DoCmd.SetWarnings False 'ワーニングoff DoCmd.RunSQL ("DELETE from T_出力 ;") '初期化 DoCmd.RunSQL ("INSERT into T_出力(コード,金額) Select 商品コード,金額の合計 from Q_出力 where 商品コード=key1 ; ") DoCmd.RunSQL ("INSERT into T_出力(コード,金額) Select 商品コード,金額の合計 from Q_出力 where 商品コード=key2 ; ") DoCmd.RunSQL ("INSERT into T_出力(コード,金額) Select 商品コード,金額の合計 from Q_出力 where 商品コード=key3 ; ") DoCmd.RunSQL ("INSERT into T_出力(コード,金額) Select 商品コード,金額の合計 from Q_出力 where 商品コード=key4 ; ") DoCmd.SetWarnings True DoCmd.OpenForm "フォーム名" DoCmd.OpenReport "レポート名", acViewPreview End Sub これで、フォーム上をダブルクリックすると積み上げが始まります。 追伸 フォームのデザインビューでコードの表示クリックするとコーディン画面になります

koube1005
質問者

補足

chayamati様 ご回答いただき有難うございます。 抽出用のテーブルをテキストボックスの値から、新しくつくるのですね。参考になります。 教えていただいた情報を基にVBAを以下のとおりとしましたが、うまくテーブルにテキストボックスの値が入力されませんでした。 Private Sub コマンド206_Click() DoCmd.RunSQL ("DELETE from T_商品 ;") '初期化 DoCmd.RunSQL ("INSERT into T_商品(商品コード,商品名,金額) Select 商品コード,商品名,金額の合計 from Q_売上 where 商品コード=txt1 ; ") DoCmd.RunSQL ("INSERT into T_商品(商品コード,商品名,金額) Select 商品コード,商品名,金額の合計 from Q_売上 where 商品コード=txt2 ; ") DoCmd.SetWarnings True DoCmd.OpenQuery "Q_売上" End Sub select~fromの部分がおかしいのでしょうか。