Microsoft Access 掲示板

AccessとADOではワイルドカードが違う件

10 コメント
views
4 フォロー

=IIf(IsDate([テキストボックス]) AND [チェックボックス] AND [コンボボックス] Like "済","完了","")

先日教えていただいた条件付き書式、コントロールソースに上記式を入れる件ですが
どうもうまくいきません。(なんだかうまくいった気がしたこともあったのですが、コンボボックスのソースを変更したりなんだりしていたらまたうまくいかなくなった。)

そこで、色々検索していて思い当たったのが以下の件です。
↓↓
「AccessとADOではワイルドカードが違う!」

教えていただいたときはワイルドカードは使っていなかったのですが、実際はワイルドカードを使っていました。コントロールソースではワイルドソースは使えないと考えた方が良いのでしょうか。ADOの件がコントロールソースにかかわってくるか教えてください。
(関わるならOrでつなげて式を長くするしかないと思っているのですが、すごくごちゃついてくるので質問しました。)

cerophan
作成: 2020/07/17 (金) 12:52:08
通報 ...
1

「AccessとADOではワイルドカードが違う!」

コントロールソースの式に関してADOはまったく関係ないです。

ワイルドカードは普通にLike 演算子 - Access

上記で紹介されているワイルドカードは使えます。(Access内のコントロールソースやクエリでは * だが、ADOでは % になるというだけのことです。)

式がまちがっているのでしょう。

2
cerophan 2020/07/22 (水) 10:07:43 1d451@23a22

こんにちは。この件ですが、どうもうまくいきません。式にエラーが出て、修正(一度消して打ち直す)すると見た目全く何も変化していないのにうまくいったり、同じことを何度も繰り返しています。時々「式が長すぎます」というようなエラーも出ます。実際すごく式が長いので、トライアンドエラーにすごく時間がかかっています。クエリのデザインビューで設定することはできますでしょうか。具体的には下記のような式が、長いものになります。(そもそも式が間違っているのでしょうか…)

=IIf((IsDate([テキストボックス1]) Or [チェックボックス1]) AND (([コンボボックス2] Like "済") Or [チェックボックス2]),"完了","")

テキストボックス1かチェックボックス1がTRUEで、コンボボックス2かチェックボックス2がTRUEなら完了、といった式が15個程度続いている

3
cerophan 2020/07/22 (水) 10:10:00 1d451@23a22

式ですが、実際は「済」のあとに「*」を使っています。関係ないと思いましたが一応修正したものを載せます。

=IIf((IsDate([テキストボックス1]) Or [チェックボックス1]) AND (([コンボボックス2] Like "済*") Or [チェックボックス2]),"完了","")

4
hatena 2020/07/22 (水) 10:16:39 修正

実際のうまくいかない式を提示してもらえますか。(長くてもいいので)

あと、そのフォームは連結フォームですか、非連結フォームですか。
連結フォームの場合は、単票フォームですか、帳票フォームですか。

5
cerophan 2020/07/22 (水) 11:24:52 0029a@1c915

ごちゃついた式ですみません。少しずつトライ&エラーで試しているところで、この式の半分程度で行き詰っていますが、全文作って載せました。
以下になります。連結フォーム、帳票フォームになります。

=IIf([cboTD01] Like "※" And [cboTD02] Like "※" And [cboTD03] Like "※" And [cboTD04] Like "※" And(IsDate([txtTD05]) Or [chkTD05]) And (IsDate([txtTD06]) Or [chkTD06]) And (IsDate([txtTD07]) Or [chkTD07]) And (IsDate([txtTD08]) Or [chkTD08]) And ([cboTD09] Like "※" Or [chkTD09]) And ([cboTD10] Like "※" Or [chkTD10]) And ([cboTD11] Like "※" Or [chkTD11]) And ([cboTD12] Like "※" Or [chkTD12]) And ([cboTD13] Like "※" Or [chkTD13]) And ([cboTD14] Like "※" Or [chkTD14]) And (IsDate([txtTD15]) Or [chkTD15],"済","")

6
cerophan 2020/07/22 (水) 11:26:12 0029a@1c915

「※」のあとには「*」があります。なぜかきえているようです。すみません。

7
hatena 2020/07/22 (水) 12:13:50 修正 >> 6

マークダウンのコードブロックに入れると * は消えません。
詳細は下記を参照してください。

Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa

下記のようになります。

=IIf([cboTD01] Like "※*" And [cboTD02] Like "※*" And [cboTD03] Like "※*" And [cboTD04] Like "※*" And(IsDate([txtTD05]) Or [chkTD05]) And (IsDate([txtTD06]) Or [chkTD06]) And (IsDate([txtTD07]) Or [chkTD07]) And (IsDate([txtTD08]) Or [chkTD08]) And ([cboTD09] Like "※*" Or [chkTD09]) And ([cboTD10] Like "※*" Or [chkTD10]) And ([cboTD11] Like "※*" Or [chkTD11]) And ([cboTD12] Like "※*" Or [chkTD12]) And ([cboTD13] Like "※*" Or [chkTD13]) And ([cboTD14] Like "※*" Or [chkTD14]) And (IsDate([txtTD15]) Or [chkTD15],"済","")
8

提示の式の場合は、閉じカッコがひとつ少ないです。

=IIf(  ・・・中略・・・ And (IsDate([txtTD15]) Or [chkTD15]),"済","")

,"済" の前に閉じカッコが必要。

ただし、
コントロールソースに設定できる式の長さには制限があったと思います。
また、このような長い式になるということは、テーブルの設計がまずい可能性が高いです。
「テーブルの正規化」ができているかをまずは確認すべきですね。

9
cerophan 2020/07/22 (水) 13:11:21 1d451@23a22

ご確認ありがとうございます。すみません。最後の「)」抜けの件は、投稿したあと気づきました…
仰る通り、式が長すぎるようでエラーが出ます。正規化は考えているつもりなのですが…

ちなみにTDというのはTODOのことで、1つの案件に15個のTODOが存在しており、それらがすべて終わったら「済」が表示されるようにするための式になります。15個すべて1つずつの案件に紐づいているTODOなので、これ以上テーブルは分割できないかと思ったのですが、何か方法がありますでしょうか。。

10
cerophan 2020/07/22 (水) 13:41:36 0029a@1c915

すみません!今アクセスを立ち上げなおしてコピーしなおしたら「長すぎる」とのエラーが出ず、どうも反映されたようです。原因は不明ですが、とりあえずうまくいきました。お手数をおかけいたしました。正規の件につきましては、なにかありましたらご助言いただけると助かります。
ありがとうございました。