質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

10458閲覧

Access VBA 複数の特定条件で検索したテーブルの内容を、クリックイベントで表示したい

nekomura

総合スコア132

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

1グッド

0クリップ

投稿2016/06/16 07:04

編集2016/06/17 08:12

よろしくお願いいたします。
フォーム上(フォームヘッダ)にある複数のコンボボックスに、リンクテーブルT_売上の
値を入れて、下記の条件でデータを検索し、サブフォーム上の帳票フォームにデータを取得させたいと
考えています。
実行はボタンクリックイベントです。
イメージ説明

検索条件(コンボボックス)
①会社、年度、期までは指定必須。
②ブランドG or ブランドはどちらか一方で OK。
以上①、②を併せた条件でデータを検索したいと考えています。
真ん中のサブフォームは、リンクテーブル「T_売上」がレ
コードソースです。
途中までコードを書いてみたものの、
条件の書き方などがわからず、手詰まりになってしまいました。

Dim objCn As New ADODB.Connection Dim objRs As New Recordset Dim strSch As String Set objCn = CurrentProject.Connection objRs.Open "T_売上", objCn, adOpenKeyset, adLockOptimistic strSch = "T_売上のから、①、②の条件に合うもの " //ネットでは特定の列を表示するサンプルしか見当たらない objRs.Find "strSch に代入した値を入れたい"

「access ado 検索 」でググり、
Find
Findその2
などを参考にしたのですが、目的の実現に沿うような記述の仕方がわからず、
試行錯誤の結果こちらで質問することにいたしました。
Findでなく、SQLなどを使った方が良いのか…?等、やり方の指南もご教示いただければありがたいです。
*追記
本業務を提示してきた上司によると、「Find」は使わないとのことで、
「SQL」を使うよう言われました。
「Filter」はどうかと聞いたところ、「Filterの条件にSQL を使うのも良いかも」との返答でした。
*(18:30現在)
有職者の皆様、ヒントや
サンプルコード
など、実現させる為のお知恵をお貸しください。
よろしくお願いいたします。

naksachi👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2016/06/16 08:25

検索結果をサブフォーム部分に表示したい、ということでしょうか。
nekomura

2016/06/16 08:30

suenaga様 >検索結果をサブフォーム部分に表示したい はい、その通りです。 コメントも今拝見いたしました。 本日何度もすみません。ありがとうございます。
guest

回答3

0

他の方との質問-回答のやり取りを見ていて、1つ気になった点があります。

今回、objRsに取得したデータに対してFilterをかけたいのだと思いますが、
提示いただいているコードでは

objRs.Open "T_店頭推進部予実管理", objCn, adOpenKeyset, adLockOptimistic とか objRs.Open "T_店頭管理", objCn, adOpenKeyset, adLockOptimistic

のように記載されています。

>サブフォームは、リンクテーブル「T_売上」がレコードソースです。
であれば、

objRs.Open "T_売上", objCn, adOpenKeyset, adLockOptimistic

なのではないでしょうか?

そのうえで、T_売上に持っている列を条件に指定して絞り込みを行うのではないかと思うのですが。

あと、条件文の作成のところで苦戦されているようでしたので、その部分だけ簡単なサンプルを作成してみました。

'条件文用変数を初期化 strCrit = "" If Textbox1.Text = "" Then '必須項目のためエラー Msgbox "必須項目が指定されていません" Exit Sub Else '値があれば条件に追加 strCrit = strCrit & " Col1 = '" & Textbox1.Text & "'" End If If Textbox2.Text = "" Then '必須項目ではないため何もしない Else '値があれば条件に追加 If strCrit <> "" Then strCrit = strCrit & " AND " End If strCrit = strCrit & " Col2 = '" & Textbox2.Text & "'" End If

対象データを抽出して画面に表示、というのはよく求められる機能ですので、がんばって完成させてください。

投稿2016/06/17 03:16

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2016/06/17 03:22

おじゃまします。 これ、サブフォームの表示自体をフィルタしたいということのようなので、直接的には objRS の取得は関係ないみたいですよ。 あるとすると、 T_売上 に対するフィルタリング条件として、コンボボックスで選択した値そのものではなく別テーブルから取得したIDのようなものを使う場合に、そちらのデータを取るためにレコードセットの取得が必要になるかもしれない、くらいです。
jawa

2016/06/17 03:25

あらま、objRsで絞り込んだ内容をサブフォームのデータソースにするわけじゃないのですか・・。
kaz.Suenaga

2016/06/17 03:32

たぶん、その方法と、フォームをフィルタリングする方法が、混在してしまっているのだと思います。
nekomura

2016/06/17 05:05 編集

jawa様 >対象データを抽出して画面に表示、というのはよく求められる機能ですので、がんばって完成させてください。 ありがとうございます。こういったアドバイスや励ましのお言葉はとてもありがたいです。 >条件文の作成のところで苦戦されているようでしたので 仰るとおりです。苦手な部分なので、サンプルコードとってもありがたかったです。 わざわざ恐れ入ります、感謝です。 また、Suenaga様からのご指摘ですが、質問をしている当方人である私が自身があまり理解できていない上での迷走もあり、jawa様、suenaga様ともにお手数をおかけしたことをお詫び申し上げます。 以下、長文となりますがご容赦ください。 真摯にご回答いただいているにも関わらず大変申し訳無いお知らせになりますが、 実はこの部分の実装が、上司からタイムアップを宣言されてしまい、一旦手を引くことになってしまいました。 その際に、本来の実現したかった実装の流れを聞いたところ、私の質問内容・Suenaga様、jawa様のアドバイスとは異なる返事が返ってきました。 本質問の実装部分は、簡単な設計図の、数行のコメントから自力で判断して作り上げるというのが今回の業務上のお題であったため、私なりに実装方法を考えてこちらで質問をさせていただいておりましたが、以上の理由により一旦閉めさせていただこうと思っています。 そのような理由で、重ね重ねになりますが、真摯にお答えいただいたにも関わらず申し訳ありませんでした。 実際のやりたい実現方法がはっきりした際に、改めて質問upまたは追記として投稿しようと考えております。 今回は失礼いたしました。 今後ともどうぞご教示のほどよろしくお願いいたします。
kaz.Suenaga

2016/06/17 05:11

> 本質問の実装部分は、簡単な設計図の、数行のコメントから自力で判断して作り上げるというのが > 今回の業務上のお題であったため、 外野なので詳細はわかりませんが、なんだかえらい難題をふっかけられていたようですね^^; 立ち位置がどういうものかわかりませんが、そんなテーマを渡されたら私なら要件定義のためのヒアリングのトレーニングに見えてしまいます。 そういった「聞き出す」ことはNGな前提であれば、上司さんの回答は「回答例」であって nekomuraさんの考えた方法が要件を満たさないのでない限り、それもまた回答の1つですよ。 いずれにせよ、今回のご質問の解決方法を身に着けておくことは悪いことではないと思いますので、業務と関係ないつもりで試行錯誤しておくといいかもしれません。
jawa

2016/06/17 06:30

>簡単な設計図の、数行のコメントから自力で判断して作り上げる こういうお題を投げられたときに重要なのは、  ①依頼者のニーズ(実現したいこと)を的確につかむこと  ②それを実現するための方法を検討すること です。 kaz.Suenagaさんも仰っていますが、 >本来の実現したかった実装の流れ は、出来上がった形の1つでしかありません。 大事なのは①の部分で、そこがちゃんとできていて、nekomuraさんなりの方法で実現できたのであれば、それも1つの答えです。 もうひとつ大事なことが  ③ニーズのあるうちに提供すること です。 今回はニーズのあるうちに提供できなかったようですが、試行錯誤した過程は無駄にはなりませんので、これからもがんばってください。
nekomura

2016/06/17 06:50

jawa様 具体的なアドバイスに感謝いたします。 技術のテクニックももちろんですが、このようなお話をいただけることも本当にためになります。 >①依頼者のニーズ(実現したいこと)を的確につかむこと >②それを実現するための方法を検討すること ①を考えた上で、②で試行錯誤しているうちに、それがうまくいかないと①がどんどんわからなくなってくる…。 という悪循環がよくあります。 また、②で行き詰ると、やらなくてはと頭ではわかっていても、「AがだめならBの方法も試す」という 広がりを持てず、どんどんハマっていく傾向にあります。 アドバイスを肝に銘じて改善していきたいと思います。 >③ニーズのあるうちに提供すること 当たり前のことなのですが、はっとさせられました。 今後くじけそうなときに必ず思い出す言葉になると思います、ありがとうございました。
guest

0

ベストアンサー

ひとまずヒント

  • サブフォーム部分に表示されているデータは、【サブフォーム】オブジェクトのプロパティとして、SELECT * FROM T_売上 に該当するレコードセットオブジェクトが設定されているもの、と考えてみましょう
  • つまりフィルタする対象は、サブフォームオブジェクトのレコードセットです

その上でこちらをどうぞ http://accessvba.pc-users.net/form/filter.html

投稿2016/06/16 08:35

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/06/16 09:48

Suenaga様 ヒントありがとうございます。 アドバイスを良く読んでから、URL拝読いたしました。 >つまりフィルタする対象は、サブフォームオブジェクトのレコードセット ということは、Form.Filter = 抽出条件(T_売上のフィールド) という認識でしょうか。 (私がskuromaku様の返信コメントに記載したコードは、対象がコマンドボックスに入っている値でした。 コマンドボックスに入っている値 = それぞれに対応したテーブルのフィールド、つまりT_売上のものではありませんでした) ・コマンドボックスで選んだ値の組み合わせを持って、 ・条件が合えばT_売上(フォーム上ではサブフォーム部分)の中で一致したレコードが出力される(現状では、サブフォーム部分にはT_売上の全レコードが表示されている状態です) やりたいことはわかっているのに、コードがなかなか思いつかない状況です。 もう少し精査します。 Suenaga様にはいつも本当に感謝しております。
kaz.Suenaga

2016/06/16 09:59

大体正しく理解しているように見えます。 Filterに設定する「抽出条件」というのは、簡単に言えば SQL でSELECT文を書いた時のWHERE句になります。 実際の T_売上 のフィールドとフォームで選択した条件のつながりがわからないので具体例はかけないですが、 SELECT * FROM T_売上 WHERE 【この部分につくり上げる抽出条件を作る】 ことからやってみると、近づきそうです。
nekomura

2016/06/17 00:57 編集

suenaga様 アドバイスありがとうございます。試行錯誤するに当たってお伺いしたいのですが、 >SELECT * FROM T_売上 WHERE 【この部分につくり上げる抽出条件を作る】 のカッコ部分には、 ・「コマンドボックスで選んだ値に応じたデータがあれば」といったようなIF文などを記述する? というような認識なのですが合っていますでしょうか。 また、 >実際の T_売上 のフィールドとフォームで選択した条件のつながりがわからないので >具体例はかけないですが どのようなことをお伝えすれば具体的なご教示をいただけますでしょうか。 suenaga様の仰る意図を掴めず申し訳ありません。 説明のしかたがよくわからないのですが ・T_売上→リンクテーブル。画面サブフォームには、帳票フォームで、リンクテーブルより、質問画面にある画像の列名どおりのデータをレコードソースとしています。 ・検索条件→各コンボボックスの標題の名前に等しいリンクテーブルより、特定の一行(フィールド)を値集合ソースとしています。 解決までに時間がかかり申し訳ございませんがどうぞよろしくお願いいたします。
kaz.Suenaga

2016/06/17 01:09

まず、この段階でのゴールは「SQL文として成立するWHERE句」なので、固定値でもいいのでWHERE句の部分を作ります。 いろいろバリエーションがあるのであれば、各バリエーション分、どういう条件の時そのWHERE句になるのか考えながら、列挙しておきます。 次にVBAのコードとして考えた際、上で列挙した「条件」別に「WHERE句を動的に作る」ことをします。 これを仮に変数 strWhere といったものに格納します。 そのうえで (フォームオブジェクト).Filter = strWhere とすればたどり着けるはずです。 >実際の T_売上 のフィールドとフォームで選択した条件のつながりがわからないので >具体例はかけないですが どのようなことをお伝えすれば具体的なご教示をいただけますでしょうか。 コンボボックスでの設定と、T_売上のなんというフィールドがどう関連するのかによって出来上がるWHERE句が異なりますので、書かれている内容ではこれ以上の想定はできません、という意味でした。 まあ T_売上 に対するWHERE句を書く、ということが重要なポイントですので、開示していただかなくても結構ですよ。
nekomura

2016/06/17 05:15

Suenaga様 丁寧なご回答に感謝いたします。 >「条件」別に「WHERE句を動的に作る」ことをします。 >これを仮に変数 strWhere といったものに格納します。 なるほど…。 この書き方は、とても参考になりました。 ところで、jawa様のコメント「以下、長文」部分から記載させていただいております理由により、本質問は、一旦閉めようと思っております。 現状では、表題と内容が変わってしまうこと、(上司より聞いた)本来の実装への実現方法が複雑で、現時点では質問や追記が出来ないことが閉める理由です。 suenaga様からはたくさんのご回答をいただき、一緒に解決に向けてお時間を割いていただいたにもかかわらず本当に申し訳ありません。 大変失礼いたしましたが、どうぞ今後ともご教示のほどよろしくお願いいたします。
nekomura

2016/06/17 05:20 編集

suenaga様 コメント追記です。 お優しいアドバイス、ありがとうございます。 >いずれにせよ、今回のご質問の解決方法を身に着けておくことは悪いことではないと >思いますので、業務と関係ないつもりで試行錯誤しておくといいかもしれません。 はい、まさにその通りだと思っております。 ご回答を元に、この件はこの件で実装に向けて解決をして力にしていきたいです。
guest

0

Filterを使えば要件を満たせそうです。
http://www.geocities.jp/cbc_vbnet/ADO/filter.html

投稿2016/06/16 07:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekomura

2016/06/16 08:20 編集

sukuromaku様 お世話になっております。 いつも私が行き着かなかったURLをご教示いただきありがとうございます。 早速下記のように記述してみたところ、エラーが出てしまいました。 うまくかけていない事と存じますが、今一度ご覧いただけないでしょうか。 「【エラー番号3001】 引数が間違った型、許容範囲外、または競合しています。」 デバックモードで、カーソルの止まるところは ”objRs.Filter = strSch” でした。 試行錯誤して記述したので、なかなか一からうまく書けず情け無いのですが (有職者の方からご覧になれば何かとおかしいコードかとも思います…) 再度ご教示をいただけないでしょうか。 よろしくお願いいたします。 _________  Dim objCn As New ADODB.Connection Dim objRs As New Recordset Dim strSch As String Dim strSql1 As String, strSql2 As String, strSql3 As String, strSql4 As String Set objCn = CurrentProject.Connection objRs.Open "T_店頭管理", objCn, adOpenKeyset, adLockOptimistic strSql1 = "SELECT A名 from T_A;" strSql2 = "SELECT B,C 期 FROM T_BC WHERE hoge= 0;" strSql3 = "SELECT D from T_D;" strSql4 = "SELECT E名 from T_E;" strSch = "(strSql1 and strSql2) and (strSql3 or strSql4) " objRs.Filter = strSch objRs.CLOSE objCn.CLOSE _____________
kaz.Suenaga

2016/06/16 08:23 編集

おじゃまします。 とりあえず strSch = "(strSql1 and strSql2) and (strSql3 or strSql4) " の後に Debug.Print strSch をいれて、その文字列がどうなっているかを見てみましょう。 多分意図しているものと異なっています。
nekomura

2016/06/16 08:29 編集

sukuromaku様 五月雨式の投稿で失礼します。 自分で投稿しておいて、なんだかおかしいと思いました…。 T_店頭管理は、サブフォームが引っ張ってきているテーブル。 変数に入れたSQL分は、各コンボボックスの中に入っている値。 …SQL分は必要無かったんですかね。。 すみません、わからなくて混乱していたようです。 少しまた考えますのでどうぞまた何かお気づきの点があればアドバイスください。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2016/06/16 08:36

Filterは条件を入れるのだと思います。T_店頭管理の列名が分からないので例えばですが、 objRs.Filter = "会社='003'" とすれば、1行だけが表示されないでしょうか?
nekomura

2016/06/16 08:58

>Filterは条件を入れる そうですよね…。参考URLもそのように書いていましたのに…。 わからないからといってへんてこなコードを載せて恥ずかしいです。。 objRs.Filter = "列名='値'" を試してみました。 該当サブフォームにはすでにT_店頭管理の全データが表示されており、また、テスト用に3件しかレコードが無いので目視で変化が変化が無いことがわかりました。 ・コンボボックスの値で検索→該当のレコードが抽出される を実現したいのですがなかなか難しいですね。 sukuromaku様のアドバイスを元にもう少しブラッシュアップできるようがんばります。 引き続きどうぞよろしくお願いいたします。
nekomura

2016/06/17 05:57

skuromaku様 お世話になっております。 本質問は、一旦閉めようと思っております。 現状では、表題と内容が変わってしまうこと、(上司より聞いた)本来の実装への実現方法が複雑で、現時点では質問や追記が出来ないことが閉める理由です。 お手数でなければjawa様の返答コメントの長文をご覧ください。 解決に向けて回答依頼にもお応えいただいたにも関わらずまことに申し訳ありません。 今後もどうぞご教示のほど頂ければ幸いです。 大変失礼いたしましたが、どうぞ今後ともご教示のほどよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問