• ベストアンサー

アクセス2007の抽出

アクセス2007の抽出 クエリをもとに検索画面を作り部署の抽出をします、 検索画面は 部署名:部署名を入力するところ    コマンドボタンで実行です     クエリの部署のフィールドのところに[部署]としていますが 部署を複数抽出する場合どうしたらいいかわかりません。 [部署]のパラメータのところに部署名ひとつ「総務」と入れると総務を抽出してくれます これを部署を複数抽出したい場合はどうしたらできますか?たとえば総務と経理を抽出 したい場合 部署は30くらいあります。 説明がよく出来なくてすみません どうぞよろしくお願いいたします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

抽出条件に "総務" Or "経理" ですが、こういうことではなく?

その他の回答 (15)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.16

それから、一度最適化をしてみてください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.15

コードは問題ないのですが、一度以下の二つの方法を やってみてください。 名前の自動修正については、以下にあります。 http://office.microsoft.com/ja-jp/access-help/HA010256413.aspx (1) 「名前の自動修正を行なう」のチェックをはずす。 OKとする。 検索を行なってみる。 (2) 同様に 「名前の自動修正情報をトラックする」のチェックをはずす。 OKとする。 検索を行なってみる。 それから、Access2007のSPのバージョンはどのように なっていますか。SP2、あるいはSP3、あるいはノーマルの ままバージョンアップは行なっていない、のどれでしょうか。 確認ですが、Q_Temp検索が消えるというのはデータベース ウィンドウから消える、ということで、オブジェクトの 依存関係の表から消える、ということではないですね。 消えた後には、新たに作成されないということですね。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.14

一度提示したサンプルを使ったフォームの 作り方などをおさらいしておきます。 (1) フォームを作ります。名前はfrm検索とします。 (2) フォームにリストボックスを適当な長さ、大きさで 張り付けます。リストボックスのプロパティを開いて 名前をlst検索とします。また、複数検索のところを 標準にします。 (3) フォームに二つのテキストボックスを貼り付け、 それぞれのプロパティを開いて、それぞれの名前を、 tx日付FROM tx日付TO  とします。 (4) コマンドボタンをフォームに貼り付け、 プロパティを開いて名前をcmd検索とし、 プロパティのクリック時イベントから コード表を開いて、 Private Sub cmd検索_Click() Call mkSQL End Sub とします。 (4) 同じ、コード表に Private Sub mkSQL() のコードをすべて張り付けます。 このコードは#11のコードでも かまいません。 (5) テーブルを テーブル名はテーブル1 各フィールドは以下のように作成。 (部署(テキスト型)、日付(日付/時刻型)、スケジュール(テキスト型)) 以上のようにしてみてください。  >今回、消えたのはfrm検索を動かそうとしている時何かを  >やってしまい消えてしまったのでしょうか?   >実はクエリの作成でQ_Temp検索を作り再度、frm検索を動かしたら  >それまで 消えてしまいました。 プログラム上は無ければ作るようになっているのですが、 プログラムのどこか変更しています? >こりずによろしくお願いいたします。 このくらいならタエラレます。 http://oshiete1.watch.impress.co.jp/qa5995365.html

lotsqq
質問者

補足

piroin654さん ありがとうございます。 >プログラム上は無ければ作るようになっているのですが、 >プログラムのどこか変更しています?  何も違うところはなく教えていただいたままに作っています。 全部、おさらいしてみました、なんとまたQ_Temp検索が消えてしまいました。 frm検索から日付とスケジュールを選択してcmdボタンをクリックすると Q_Temp検索がパッと消えます。 下記を貼り付けています。 Option Compare Database Private Sub cmd検索_Click() Call mkSQL End Sub Private Sub mkSQL() Dim db As Database Dim qdf As QueryDef Dim ctl As Control Dim strKey As String Dim strSQL As String Dim varitm As Variant Set db = CurrentDb On Error Resume Next '前回作成したクエリを削除。二重作成によるエラーの回避’ For Each qdf In db.QueryDefs If qdf.Name = "Q_Temp検索" Then DoCmd.DeleteObject acQuery, "Q_Temp検索" End If Next qdf Set ctl = Me!lst検索 For Each varitm In ctl.ItemsSelected strKey = strKey & ",'" & ctl.ItemData(varitm) & "'" Next varitm strKey = Mid(strKey, 2) strSQL = "SELECT テーブル1.部署, テーブル1.日付, テーブル1.スケジュール " & _ "FROM テーブル1" & _ "WHERE (((テーブル1.部署) In (" & strKey & "))AND((テーブル1.日付) " & _ "Between [Forms]![frm検索]![tx日付FROM] " & _ "And [Forms]![frm検索]![tx日付TO]));" Set qdf = db.CreateQueryDef("Q_Temp検索", strSQL) DoCmd.OpenQuery ("Q_Temp検索") qdf.Close Set qdf = Nothing db.Close Set db = Nothing End Sub 同じですね? よろしくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.13

追加ですが、 最初のデータベースにはQ_Temp検索 は存在しませんが、 プログラムを実行している状態では、 あたかもQ_Temp検索という名前の クエリがずーーーーっと存在している ように状態です。なければ新たに 作り直す、あれば、一度つくり直す というようにプログラム されています。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.12

肝心な説明が抜けていました。 >Q_Temp検索が消えてしまいました、 >frm検索を実行させたために消えたのか >その前からなかったのかは不明です。がっかりです。 がっかりさせてしまいました。実はプログラムでは 最初にQ_Temp検索という名前のクエリは存在しないのです。 最初に、プログラムを実行するとそのとき初めて Q_Temp検索という名前のクエリが作られます。 このクエリはプログラムを実行するたびに内容が 書き換えられるのでプログラムを実行するごとに 最初にQ_Temp検索という名前のクエリを一度削除し、 また同じ名前のQ_Temp検索を作成するようにプログラム しています。Q_Temp検索1あるいはQ_Temp検索2 のような名前だと同じとは見なさないので 削除はしません。

lotsqq
質問者

補足

piroin654さん ありがとうございます。 すごく解りやすく助かります。 >最初にQ_Temp検索という名前のクエリは存在しないのです。 >最初に、プログラムを実行するとそのとき初めて >Q_Temp検索という名前のクエリが作られます。  はい、コードをみるとなんとなくですが理解できます  今回、消えたのはfrm検索を動かそうとしている時何かを  やってしまい消えてしまったのでしょうか?   実はクエリの作成でQ_Temp検索を作り再度、frm検索を動かしたら  それまで 消えてしまいました。  また、試してみます。     こりずによろしくお願いいたします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.11

Private Sub mkSQL() Dim db As Database Dim qdf As QueryDef Dim ctl As Control Dim strKey As String Dim strSQL As String Dim varitm As Variant Set db = CurrentDb On Error Resume Next '前回作成したクエリを削除。二重作成によるエラーの回避 For Each qdf In db.QueryDefs If qdf.Name = "Q_Temp検索" Then 'Q_Temp検索という名前のクエリがあれば以下で削除 DoCmd.DeleteObject acQuery, "Q_Temp検索" End If Next qdf 'リストボックスで選択された項目の取得 Set ctl = Me!lst検索 For Each varitm In ctl.ItemsSelected strKey = strKey & ",'" & ctl.ItemData(varitm) & "'" Next varitm 'リストボックスから取り出した項目の整形 strKey = Mid(strKey, 2) 'リストボックスから取り出した項目とテキストボックスの日付 'をSQL文に設定 strSQL = "SELECT テーブル1.部署, テーブル1.日付, テーブル1.スケジュール " & _ "FROM テーブル1 " & _ "WHERE (((テーブル1.部署) In (" & strKey & ")) AND ((テーブル1.日付) " & _ "Between [Forms]![frm検索]![tx日付FROM] " & _ "And [Forms]![frm検索]![tx日付TO]));" 'SQL文をもとにQ_Temp検索という名前のクエリを作成 Set qdf = db.CreateQueryDef("Q_Temp検索", strSQL) 'Q_Temp検索という名前のクエリを表示 DoCmd.OpenQuery ("Q_Temp検索") '以下は後始末 qdf.Close Set qdf = Nothing db.Close Set db = Nothing End Sub

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.10

一応、Q_Temp検索という名前のクエリが存在すれば プログラムの設計上削除するようになっています。 [frm検索を実行したときのプログラムの流れの説明] 1 Q_Temp検索というクエリが存在しないか確認 2 Q_Temp検索というクエリが存在すれば二重作成   のエラー回避のためにこの名前のクエリを削除 3 Q_Temp検索という名前のクエリを作成する情報を  フォームのテキストボックスとリストボックスから  取得 4 Q_Temp検索という名前のクエリを作成 5 Q_Temp検索を表示 という流れになります。したがって、Q_Temp検索という 名前のクエリがあれば最初に削除するので、もしその クエリを保存したいのならば、他の名前に変更しておい てください。たとえば、Q_Temp検索1、あるいはまったく 別の名前に変更。 コードの説明をコード表に入れておきました。 そのままコード表に張り付けてもいいです。 'ボタンをクリックします。 Private Sub cmd検索_Click() 'mkSQLというコードを呼び出します。 Call mkSQL End Sub

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

SQL文中の半角スペースについて たとえば、 "FROM テーブル1 " & _ の 1 と " の間には半角スペースが入っています。 また、 "WHERE (((テーブル1.部署) In (" & strKey & ")) AND ((テーブル1.日付) " & _ の ) AND ( の部分も ) と AND と ( の間にはそれぞれ半角スペースが 入っています。

lotsqq
質問者

補足

piroin654さん お世話になります。 呆れずに聞いてください。 Q_Temp検索が動いたと言って、frm検索からやってみようとすると Q_Temp検索が消えてしまいました、frm検索を実行させたために消えたのか その前からなかったのかは不明です。がっかりです。 作成のクエリからやるべきですか? よろしくお願いします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.8

それと、回答ではテーブル1になっていますが、 これはクエリに置き換えても結果は同じです。 こちらでは、テーブル1を、いくつかのテーブルの 組み合わせによるクエリに置き換えて抽出もしています。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

クエリ式’(((テーブル1部署)In())AND((テーブル1日付)Between[Forms]![frm検索]! [tx日付FROM]And[froms]![frm検索]!「tx日付TO」))'の構文エラー:;演算子がありません もし、このようなエラーならば、二つのANDが前後と くっついているのでAccessがSQL文を解釈できなく なっている、と思われます。 コード中のSQL文はAccessがSQL文として解釈できる ように半角のスペースが構文中や構文の途中の末尾 などに入れてあります。もしSQL文を手直しされたならば 一度、張り付けた状態でそのまま使ってみてください。 なお、張り付けるときは、コード表の一番左端に張り付けて ください。 また、Q_Temp検索をデザインビューで開いてSQLビュー にすると、以下のようなSQL文が出てきます。 SELECT テーブル1.部署, テーブル1.日付, テーブル1.スケジュール FROM テーブル1 WHERE (((テーブル1.部署) In ('経理部','人事部')) AND ((テーブル1.日付) Between [Forms]![frm検索]![tx日付FROM] And [Forms]![frm検索]![tx日付TO])); これは、実際にリストで経理部、人事部と選んだ状態の もので、これに日付を入れればクエリが結果を表示 します。このまま日付を無視して開くと空の クエリ結果が表示されます。 もし、他に表示するクエリ、またはテーブルの フィールドがあるならば、いくつか入れたSQL文を 表示してもいいですが。 コード中のSQL文はここに張り付けたときに 長いと改行されてエラーを起こしたり、 分かりにくくなったりするのを防ぐために 少し短めに区切ってあります。

lotsqq
質問者

補足

piroin654さん お世話になります。 途中経過ですが、 Q_Temp検索動きました。本当に良かったです。 まだfrm検索はこれからです。 また、よろしくお願いいたします。

関連するQ&A