Microsoft Access 掲示板

クエリ テキストボックスの1文字のみ一致による抽出

12 コメント
views
4 フォロー

お世話になっております。連続投稿申し訳ございません。

フォームA テキストボックス名:検索BOX
クエリA(下記)

種類
A
B
C

クエリA 「種類」の抽出条件に

Like "*" & [Forms]![フォームA]![検索BOX] & "*"

と記入し、検索BOXに「A」と記入してクエリ実行すると種類「A」のみ抽出されるのは分かります。
例えば、検索BOXに「AあいうえおB」と入力したときに、上記の構文だと「AあいうえおB」の文字列を含むレコードが抽出されます。(上記クエリでは0件ということになります。)

ここから本題なのですが、検索BOXの文字列ではなく、1文字のみ一致していれば抽出されるようにするには、どのようにすればよいでしょうか?(「AあいうえおB」の場合「A」と「B」が抽出されるようにしたい)

mae
作成: 2019/04/24 (水) 11:10:57
通報 ...
1

クエリAで下記のように設定すればいいでしょう。

フィールド [Forms]![フォームA]![検索BOX]
表示
抽出条件 Like "*" & [種類] & "*"
2

早々のご回答ありがとうございます。
できました!逆の発想をすればよかったんですね。

返信の速さに驚くのと同時に、感謝の気持ちでいっぱいです。
ありがとうございました。

3

お世話になっております。
申し訳ございません、もう少しご教授をお願いします。
クエリとフォームのテキストボックスを比較して、1文字のみ一致していれば抽出されるようにするには、どのような抽出条件になるのでしょうか?


クエリA

種類
abzc
btrw
cwrq
dqe

フォームAの検索BOXに「bac」と記入されている場合、「a」「b」「c」を含む「abzc」「btrw」「cwrq」が抽出される。

何度も申し訳ございませんがよろしくお願い致します。

4

関数のみでは難しいので、VBAが必要になりますが、大丈夫ですか。

そのようなことが本当に必要なのでしょうか。

5
macof 2019/04/26 (金) 17:47:28 修正 f2487@13667

横からすいません。
最初の質問にあった条件式を変形して

Like "*[" & [Forms]![フォームA]![検索BOX] & "]*"

で行けませんかね。
厳密には角括弧とかハイフンのエスケープが必要になると思いますが…

追記
普通に入力するとアスタリスクが飛ぶことに気付いてませんでしたので修正しました。
すいません…

あと、このようなことをしなくてはいけないのはそもそもテーブル設計でやらかしてる可能性が高いとは思います。

8

macofさん、回答ありがとうございます。
なるほど、それは思いつきませんでした(;'∀')
それでいけますね。

6

下記、質問をした経緯をご説明します。

種類名前
aりんご
bみかん
cぶどう
dいちご
_
案件種類
1a
2abc
3bd

1案件に複数の果物データが保持してあります。

まず、登録フォームで それぞれのチェックボックスにチェックいれると、
りんごをチェックした場合

[種類] = [種類] & "a"

みかんをチェックした場合

[種類] = [種類] & "b"

というように、[種類]のテキストボックスに文字列ができていきます。
りんご、みかん、ぶどうにチェックをいれると、「abc」となります。

登録されたテーブルを確認するとき、上記のような検索BOXを用いて抽出したいという意向でした。

はじめは下記のようなテーブル構成を考えていたのですが、

案件りんごみかんぶどういちご
1truefalsefalsefalse
2truetruetruefalse
3falsetruefalsetrue

これだと種類が追加されたとき再構成の必要があり、またフィールドもどんどん増えてしまうのでどうしたものかと考えた時に、上記の方法はどうだろうかと至った次第です。

VBAで解決できるなら問題ありません。
また、もし別のやり方でもっと簡単にできるのであればそれでも構いません。
お手数をおかけしますが、ご教授のほどよろしくお願いいたします。

7

macof さん
アドバイスありがとうございます。(返信を長々と書いていたので気付くのが遅れました…)
上記の条件式を試したところ、無事にできました!ありがとうございます!

でもこのようなテーブル設計はやはりナンセンスでしょうか…?

9

maeさん
やはりそのテーブル設計はまずいですね。

リレーショナルデータベースの機能を活用できません。

例えば、果物の種類ごとの集計をしようとしても、それではできません。

案件テーブル

案件ID案件名
1AAA
2BBB
3CCC

 
案件明細テーブル

案件ID種類
1a
2a
2b
2c
3b
3d

 
というように2つのテーブルに分割します。
(テーブル名は適当ですので、内容に沿ったものにしてください。)

入力フォームはメイン/サブフォーム形式になります。

イメージとしては下記のリンク先のようなフォームになります。

帳票フォームで項目(行)を固定表示する - hatena chips

10

hatenaさん
ご回答ありがとうございます。
なるほど…私のやり方ではせっかくのAccessの機能をうまく活用できていないわけですね。

hatenaさんのブログを色々漁ってみたのですが、そこには辿り着けませんでした…
方向性を示して頂きありがとうございます。作り方が見えてきました。

参考リンク先をもとにテーブルを作り直してみます。
hatenaさん、macofさん ありがとうございました!

11

このような設計方法を「正規化」といいます。「テーブル 正規化」でWEB検索すると解説ページがいろいろ見つかるので分かり安そうなページを読んでおくといいでしょう。完全に理解できなくても、なんとなく雰囲気をつかんでおくと、いろいろ経験を積んでいくうちに理解できるようになるでしょう。

また、このような設計にしておくと、

案件りんごみかんぶどういちご
1truefalsefalsefalse
2truetruetruefalse
3falsetruefalsetrue

というレイアウトは、クロス集計クエリという機能で簡単に変換できます。

12

正規化と言うんですね!その言葉は全然知らなかったので、「1文字のみ 一致」とかでずっと調べてました。。
調べてみると一朝一夕で身につくものではなさそうですが、、せっかくなのでこのGWにじっくり勉強してみます!

それにしてもAccessは奥が深いですね。
出来ることが増えるとどんどん面白くなってきて楽しくなってきます♪