検索フォームで年度を検索する方法

このQ&Aのポイント
  • T_マスタというテーブルに名前や所属の課、年度などが入っています。検索ボタンがいくつかあり、年度を検索するようにテキストボックスがあります。年度テキストボックスにいれた年度で検索しつつ、押した検索ボタンによって検索する方法はどのようにしたらよいでしょうか?
  • ソースコードの一部で、年度テキストボックスに入力された年度で検索条件を生成しています。検索ボタンが押された場合は、生成された条件を使用してレポートを表示します。
  • 検索フォームで年度を指定して検索する方法について教えてください。
回答を見る
  • ベストアンサー

検索フォームで検索するものが決まっているときのかきかた。

Ac2000です。 T_マスタというテーブルに 名前や所属の課、年度などが入っています。 このTマスタから検索する検索フォームがあります。 検索ボタンがいくつかあり、 年度を検索するようにテキストボックスがあります。 年度テキストボックスにいれた年度で検索しつつ、 押した検索ボタンによって検索する方法はどのようにしたらよいでしょうか? Ex.検索ボタンには所属の課などがかいてあり、「総務」「営業」などどかいてあります。 ソースはこんな感じです。 ------------------------------ Dim SQL As String Dim WhereCond As String Dim condNendo As String '年度 If Me!年度.Value <> "" Then condNendo = "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")" WhereCond = WhereCond & " AND " & condNendo End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenReport "R_マスタ_一覧", acPreview, , WhereCond End Sub

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.5

こんにちは。maruru01です。 [Tマスタ]テーブルが人を管理するためのテーブルである以上、同じ人を2重に登録するのは都合が悪いと思います。 手としては、所属フィールドを複数にする(1つ目の所属が営業部、2つ目が総務部という風に入力する) あとは、所属欄に、"営業部・総務部"と入力して、検索では、"*総務部*"という風に前後にワイルドカードを置くという方法です。 どちらにせよ面倒ですが。

KODAMAR
質問者

お礼

回答ありがとうございます。 フィールドを増やして 「所属グループ」「所属グループ2」「所属グループ3」・・・「所属グループまとめ」([所属グループ]&[所属グループ2]・・・となってます。) としました。 ここで新たな問題なのですが、 今までは「T_マスタ」に「ID」「氏名」「所属」「所属グループ」などを入力していたのですが、 これからは「T_マスタ」には「ID」だけを入力し、 他は「T_社員一覧」にまとめて管理することになりました。 「T_社員一覧」は「ID」「氏名」「所属」「所属グループ」「所属グループ1」「所属グループ2」・・・「所属グループまとめ」 となっています。 教えていただいた関数の If Me!年度.Value <> "" Then cond = "(T_社員一覧.所属グループまとめ = '" & Syozoku & "') AND " & _ "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")" DoCmd.OpenReport "R_マスタ_一覧", acPreview, , cond の部分を変えてみたのですが、 (「T_マスタテーブル.所属課」>「T_社員一覧.所属グループまとめ」) これではうまく作動しませんでした。 これを回避する方法というのはあるのでしょうか? いきなり方向転換してしまって申し訳ありませんが、よろしくお願いいたします。

KODAMAR
質問者

補足

すいません。 印刷用のテーブルを作成することにしました。 長々とありがとうございました。 関数のつくり方覚えてまたひとつAccessが便利になりました♪

その他の回答 (4)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.4

コマンドボタン名は、"部"ですか。 もちろん、"*"を使用したあいまい検索は出来ます。 例) cond = "(T_マスタテーブル.所属課 LIKE '" & Shozoku & "*') AND " & _     "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")" でもこれだと、総務部の庶務課や経理課は拾えません(あたり前ですが)。 なので、レコード数がいくつあるか分かりませんが、[T_マスタ]テーブルに、[所属部]フィールドを作った方がいいと思います。

KODAMAR
質問者

お礼

回答ありがとうございます。 やはりこんなふうにグループ分け用の所属をつくらなくちゃだめですよね。 今それをつくっているのですが、問題が出てきました。 たとえば、「営業部」の中に「営業1課」「営業2課」の人たちが入るとします。 そして「総務部」の中に「庶務課」「経理課」「営業1課」の人たちが入るとします。 「営業1課」の人たちが「営業部」と「総務部」の両方に入ることになるんです。 こうなると、教えていただいた myOpenReport "**課" という方法だと1つしかダメですよね? 営業2課 → 営業部 庶務課 → 総務部 経理課 → 総務部 とすればそれぞれはわけられますが、この場合「営業1課」は どのようにグループ分けすればいいのかわかりません。 同じひとたちを2回入力するわけにいかないし。。。 何かいいアイディアないでしょうか? 申し訳ありませんが、よろしくお願いします。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

>「検索フォームのコードモジュール」ってどこでしょうか? コマンドボタンのクリックイベントなどが書かれてある"白い紙"です。 これをモジュール、またはコードモジュールといいます。 モジュールは、フォーム(またはレポート)ごとに1枚ずつあります。 このモジュールに記述された関数は、このフォームが開いている間、このフォーム上でのみ使用出来ます。 また、どのフォームとも関係ない"標準モジュール"というのがあります。 ここにPublic(Privateのかわりに)で関数を書けば、どのフォーム上でも使用出来ます。 ちなみに、各イベントのコードは、そのコントロール(コマンドボタン)が配置されているフォームのモジュールにしか記述出来ません。 回答の補足がよくわかりません。 質問の文意から、ユーザーが入力する年度と、ある特定の所属の両方に当てはまるレコードを抽出してレポートに出すと思ったんですが。 "ひとつのボタンで複数の所属を出す"とは?

KODAMAR
質問者

お礼

回答ありがとうございます。 >回答の補足がよくわかりません。 >質問の文意から、ユーザーが入力する年度と、ある特定の所属の両方に当てはまるレコードを抽出してレポートに出すと思ったんですが。 はい、その通りです。 >"ひとつのボタンで複数の所属を出す"とは? たとえば「総務」というボタンを押したときには、 「総務課」「庶務課」「経理課」などが抽出される。 「営業」というボタンを押した時には、 「営業1課」「営業2課」などが抽出される、という意味です。 おわかりいただけたでしょうか? 教えていただいたコードで試したら条件がひとつだけ、でしたら無事できました。 上記にかいたように、複数検索、そしてあいまい検索(総務部・総務課を「総務*」で検索できる、みたいな 感じで)ができれば教えてください。よろしくお願いします。

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

再びmaruru01です。 myOpenReport関数を次のように書き換えます。 Private Sub myOpenReport(Shozoku As String)   Dim cond As String   If Me!年度.Value <> "" Then     If Shozoku = "なし" Then       cond = "T_マスタテーブル.年度 = " & CLng(Me!年度.Value)     Else       cond = "(T_マスタテーブル.所属課 = '" & Shozoku & "') AND " & _          "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")"     End If     DoCmd.OpenReport "R_マスタ_一覧", acPreview, , cond   Else     MsgBox "年度を入力して下さい。"   End If End Sub (ただの)[検索]ボタンのクリックイベントには   myOpenReport "なし" それ以外の所属(例えば営業)の付いたボタンのクリックイベントには   myOpenReport "営業" これでいけると思いますが。

KODAMAR
質問者

お礼

何度もありがとうございます。 すいませんがわからないことがあるのでよろしくお願いします。 >検索フォームのコードモジュールの適当な場所・・・ 「検索フォームのコードモジュール」ってどこでしょうか? よろしくお願いします。

KODAMAR
質問者

補足

クエリで出す際のSQLです。 (ひとつのボタンで複数の所属を出すことがあるので。。。) SELECT T_マスタテーブル.年度, T_マスタテーブル.時期, T_マスタテーブル.社員番号, T_マスタテーブル.社員氏名,・・・ FROM T_マスタテーブル WHERE (((T_マスタテーブル.所属) Like "購買*" Or (T_マスタテーブル.所属) Like "生産管理*" Or (T_マスタテーブル.所属) Like "業務*"));

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 検索フォームのコードモジュールの適当な場所(一番下とか)に次の関数を自作します。 Private Sub myOpenReport(Shozoku As String)   Dim cond As String   If Me!年度.Value <> "" Then     cond = "(T_マスタテーブル.所属課 = '" & Shozoku & "') AND " & _        "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")"     DoCmd.OpenReport "R_マスタ_一覧", acPreview, , cond   Else     MsgBox "年度を入力して下さい。"   End If End Sub 各コマンドボタンのクリックイベントに以下のコードを記述します。 ([cmd営業]ボタンの場合) Private Sub cmd営業_Click()   myOpenReport "営業" End Sub

KODAMAR
質問者

お礼

いつもいつもお世話になります。 ちょっと描き方が悪かったようですね(--; 検索ボタンは「(ただの)検索」(←通常使う検索ボタンです。)「営業」「経理」・・・ とあり、「営業」を押した時は、検索フォームに入力された年度を検索しつつ、マスタの 「営業」を検索して、レポートに表示させたいのです。 ただ、所属の箇所に「営業」と入力しなくても、ボタンを押したら「営業」を検索したことと 同じ結果が出せるようにしたいのです。 また、レポートはどの所属を検索しても同じレポートを使おうと思っています。 (検索ごとに条件は変わるけど、レポートは変わらないということです。) 説明が下手ですいません。 よろしくお願いします。 # もし勘違いをしていたらすいません。

関連するQ&A

  • サブフォーム用のテーブルのデータで検索をしてマスタフォームに表示したい。

    Access2000での質問です。 T_マスタ(氏名ID・氏名)・T_サブ(氏名ID・データ年・データ種類)というテーブルから F_マスタ・F_サブというフォームを作成し、 F_マスタの中にサブフォームとしてF_サブを入れています。(氏名IDでリンク) F_検索というフォームを作成し、 データ年・データ種類で検索するようにしました。 この結果を、F_マスタで表示したいのですが、 F_マスタはT_マスタから作成されているため、検索結果が 希望するものではなくなってしまいます。 F_サブでみればきちんと検索されているのですが、 それでは氏名がみれないので。。。 このようなことはできるのでしょうか? F_検索の検索ボタンのコードです。 ------- Private Sub コマンド1_Click() Dim SQL As String Dim WhereCond As String Dim condNendo As String Dim condSyurui As String 'データ年 If Me!データ年.Value <> "" Then condNendo = "(T_サブ.データ年 like '*" & Me!データ年.Value & "*')" WhereCond = WhereCond & " AND " & condNendo End If '種類 If Me!データ種類.Value <> "" Then condSyurui = "(T_サブ.データ種類 like '*" & Me!データ種類.Value & "*')" WhereCond = WhereCond & " AND " & condSyurui End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "F_サブ", acNormal, , WhereCond End Sub ------- *上記の「F_サブ」を[F_マスタ」で開くようにしたいのです。 宜しくお願いします。

  • Accessの検索フォーム作成で。

    Access2000です。 一覧テーブルは ・名前 ・項目1 ・評価1 ・項目2 ・評価2 となっていて、 山田太朗  | タバコのポイ捨てはしない  | 5 | 10分前行動 | 4 | 前田前   | 交通ルールを守る      | 5 | 挨拶をする  | 4 | 大坪拳   | 10分前行動        | 4 | 挨拶をする  | 5 | のようになっています。 これをもとに「検索フォーム」をデザインフォームで、 名前   [     ] 項目1  [     ] 項目2  [     ] 項目3  [     ] と作成し、「検索」というボタンを押すと、「検索結果フォーム」に検索結果が出るようにしました。 検索ボタンは Private Sub コマンド9_Click() Dim SQL As String Dim WhereCond As String Dim condName As String Dim condKoumoku1 As String Dim condKoumoku2 As String Dim condKoumoku3 As String WhereCond = "" '名前 If Me!名前.Value <> "" Then condName = "(一覧.名前 like '*" & Me!名前.Value & "*')" WhereCond = WhereCond & " and " & condName End If '項目1 If Me!項目1.Value <> "" Then condKoumoku1 = "(一覧.項目1 like '*" & Me!項目1.Value & "*')" WhereCond = WhereCond & " and " & condKoumoku1 End If : WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "検索結果フォーム", acNormal, , WhereCond End Sub となっています。 そこで、検索フォームで 項目に検索値を入れた場合、一覧の項目すべての中から検索できるようにするにはどうしたらいいのでしょうか? また、今の状態ですとand検索ですが、or検索するにはどのようにしたらいいでしょうか?

  • Accessの検索フォーム(CLng)で。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 (項目1-5は数値データなのであいまい検索はしたくありません。) 検索ボタンのコードは Select Case Me!検索方法.Value Case 1 'or tempOper = " AND " strCount = 5 Case 2 'and tempOper = " OR " strCount = 4 End Select '名前 If Me!SyainName.Value <> "" Then condName = "(T_マスタ.氏名 like '*" & Me!SyainName.Value & "*')" WhereCond = WhereCond & tempOper & condName End If If Me!項目1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 = " & CLng(Me!項目1.Value) & ")" condKoumoku2 = "(T_マスタ.項目2 = " & CLng(Me!項目1.Value) & ")" condKoumoku3 = "(T_マスタ.項目3 = " & CLng(Me!項目1.Value) & ")" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempCond = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '((OR OR))' の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? Access2000です。

  • 以下のアクセスの検索フォームで。。。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 検索ボタンのコードは Select Case Me!検索方法.Value Case 1 'or tempOper = " AND " strCount = 5 Case 2 'and tempOper = " OR " strCount = 4 End Select '名前 If Me!SyainName.Value <> "" Then condName = "(T_マスタ.氏名 like '*" & Me!SyainName.Value & "*')" WhereCond = WhereCond & tempOper & condName End If '項目 If Me!Koumoku1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 like '*" & Me!Koumoku1.Value & "*')" condKoumoku2 = "(T_マスタ.項目2 like '*" & Me!Koumoku1.Value & "*')" condSKoumoku3 = "(T_マスタ.項目3 like '*" & Me!Koumoku1.Value & "*')" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempComd = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '(OR((T_マスタ.項目1 like …')の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? (項目を含まない状態ではうまく検索できてました。) Access2000です。

  • access検索フォームで期間抽出

    普通の文字入力による検索は If Me!氏名.Value <> "" Then condName = "(T_社員マスタ.氏名 like '*" & Me!氏名.Value & "*')" WhereCond = WhereCond & tempOper & condName End If のようにしています。 たとえば2000/10/1~2003/10/1 のように、ある一定の期間を指定してそれに当てはまるものを検索結果として出したい場合は、 上記をどのように変更すればいいのでしょうか?

  • Accessの検索で「~以外」

    VBAで検索フォームを作成しています。 普通は「○○にあてはまるもの」という検索ですが、 「○○以外のものを検索」というようにしたい場合はどのようにすればいいのでしょうか? 通常の検索はこんな感じです。 If Me!検索値.Value <> "" Then condKey = "(T_マスタ.フィールド like '*" & Me!検索値.Value & "*')" WhereCond = WhereCond & tempOper & condKey End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond access2000です。

  • Access検索フォームで範囲を指定しての検索

    クエリーで計算して出した結果をもとにフォームを使って検索をしたいのですが、うまくできません。 クエリーの計算式は誕生日から年齢を出すものが入っています。 フォームのボタンにVBAで '年齢 If Me!年齢開始.Value <> "" Then Age1 = "(Q_メイン.年齢 >= " & "0" & " and =< " & Me!年齢終了.Value & ")" WhereCond = WhereCond & tempOper & Age1 End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond となっています。 tempOperは、検索方法がORとANDが選べるようになっていて、それの結果が入っています。

  • Accessの検索フォーム

    以前にも似たような質問をして、その時は解決したのですが、また同じようなことでつまづいて、以前の回答をみて、 そのとおりにやってるつもりなのに、できなくて…。 テーブル1とフォーム1・フォーム2があります。 フォーム1に入力された情報をもとに、テーブル1の内容を検索して、フォーム2に表示するものを作成しています。 テーブル1には「***.***.**.☆」(情報)という形の情報が入っています。 *の部分の桁数は固定で☆は不定形です。(テキスト形式) フォーム1に入力された情報は「(***.***.)**.*」(検索1)や「(***.***.)**.**」(検索2)などです。 ※()内は入力せず テーブル1の情報の9文字目以降と、フォーム1に入力された情報を比べたくて、以下のようなものを作成しました。 (多少省略等があります) condKensaku = "(Mid(Val(テーブル1.情報),9) between " & Val(Me!検索1.Value) & " and " & Val(Me!検索2.Value) & ")" wherecond = condKensaku DoCmd.OpenForm "フォーム2", acNormal, WhereCond これを実行すると 実行時エラー '2501': OpenForm アクションの実行はキャンセルされました。 と出て、デバッグを押すと、 DoCmd.OpenForm "フォーム2", acNormal, WhereCond の行が黄色になります。

  • アクセスVBAの検索で。

    アクセスでカレンダーというかスケジュールを管理できるようなものをつくろうとしています。 非連結フォーム1に ・入力年 ・入力月 ・[1]-[45]まで(それぞれ年月が変わると日付がかわる) という感じで入っています。 T_用件というテーブルには ・年(数値型 ・月(数値型 ・日(数値型 ・用件(テキスト型) とあり、これをもとに「F_用件」フォームを作成してあります。 フォーム1のボタンの1つを例にとるとこんな感じです。 If Me![7].Value <> "" Then Year = "(T_用件.年=" & (Me!入力年.Value) & ")" Month = "(T_用件.月=" & (Me!入力月.Value) & ")" Day = "(T_用件.年=" & (Me![7].Value) & ")" WhereCond = WhereCond & " AND (" & Year & " AND " & Month & " AND " & Day & ")" End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "F_用件", acNormal, , WhereCond こうするとF_用件フォームは開くのですが、きちんと検索されてきません。 どこが悪いのでしょうか? よろしくお願いします。

  • 帳票フォームの全件のレポート出力

    OS:XP Access Version:2007 抽出されたレコードが帳票フォームで表示されているのですが、 その複数抽出のレコードすべてをレポート出力したいのですが。。。どうすばいいわからなくて どなたかいい方法をおしえてください。 抽出条件コードはこれです。 Private Sub btnSearch_Click() Dim strWhere As String Dim strAndOr As String strWhere = vbNullString If Me.optAndOr.Value = cAnd Then strAndOr = " AND " Else strAndOr = " OR " End If If Me.txtYear.Value <> vbNullString Then strWhere = strWhere & strAndOr & " 年度 LIKE '*" & Me.txtYear.Value & "*'" End If If Me.txtName.Value <> vbNullString Then strWhere = strWhere & strAndOr & " 営業担当 LIKE '*" & Me.txtName.Value & "*'" End If 'WHERE句編集 strWhere = Replace(strWhere, strAndOr, "WHERE", , 1) 'レコードソース書き換えと再クエリ Me.RecordSource = cBaseQuery & " " & strWhere Me.Requery End Sub

専門家に質問してみよう