お世話になります。
分割フォームでフィルタリングしたデータをタブ区切りのテキストファイルにエクスポートしたいです。
ほぼほぼ下記でやろうとしてることと同じです。
https://oshiete.goo.ne.jp/qa/4340421.html
上記ベストアンサーにあるとおり、フォームと同じ絞込みをするクエリを作ればよいことは分かったのですが、
フォームには対象フィールドの異なるコンボボックスが2つあり、コンボボックスAが空白だった場合、フィルター条件から外しています。この場合はクエリの抽出条件をどのように書けばよいの分かりません。
試しに以下のように書いてみたのですが、クエリの結果はレコードが1件も表示されません。
IIf([Forms]![txt出力]![コンボボックスA]="",Like "*",[Forms]![txt出力]![コンボボックスA])
そもそもクエリの抽出条件を付加したり、外したりといった分岐ができるのでしょうか?
よろしくお願いいたします。
フォームでのフィルタリングはどのようにしているのでしょうか。
レコードソースのクエリに抽出条件を設定している。
あるいは、
フォームのフィルター機能を使っている。
これは、どのように実現しているのでしょうか。
それとも、この設定方が分からないということでしょうか。
フォームのフィルターは以下をボタンに埋め込んでいます。
Private Sub 絞込みボタン_Click()
Dim strFilter As String
'[材質・メーカー]の条件の指定
If Nz(Me![コンボボックスA], "") <> "" Then
strFilter = strFilter & _
" AND (CSVエクスポート_クエリ.[材質] Like '" & Replace(Me![コンボボックスA], "'", "''", , , vbBinaryCompare) & "')"
End If
'[発注先]の条件の指定
If Nz(Me![コンボボックスB], "") <> "" Then
strFilter = strFilter & _
" AND (CSVエクスポート_クエリ.[仕入先] Like '" & Replace(Me![コンボボックスB], "'", "''", , , vbBinaryCompare) & "')"
End If
'先頭の" AND "を取り除く
strFilter = Mid(strFilter, 6)
'フィルター条件がひとつでもあったら
If strFilter <> Null Or strFilter <> "" Then
'フィルター条件の設定
Me.Filter = strFilter
'フィルターの実行 (もしくは解除)
Me.FilterOn = (strFilter <> "")
'フィルター条件がなにもなかったら、レコードを全件非表示にする
Else
Me.Filter = "False"
Me.FilterOn = True
End If
End Sub
これと同じことを、全く同じフィールドを持つ別のクエリを作り、抽出条件に書こうとしています。その後クエリを実行してtxtファイルにエクスポートしようとしています。
よろしくお願いします。
よくある手法
【Access】複数テキストボックスが空の場合は無視して値がある時だけ抽出できるクエリってできないの?(PCTipsさん)
汎用性の高い手法
MS-Access97超入門>絞込みの仕組みを作る(魔法使いの開発工房さん)
VBAで動的にクエリを作るとか、フォームのデータを直接テキストファイルとして吐き出す(VBA)とかもありますね
VBAで動的にクエリを作るならできます
Like IIf(IsNull([Forms]![txt出力]![コンボボックスA]),"*",[Forms]![txt出力]![コンボボックスA])
試してないから失敗したら、ごめんなさい。
方法としては、主に下記の2つになります。
クエリで抽出条件を設定する。そのクエリをフォームのレコードソースにして、再クエリで抽出条件を反映させる。
このクエリをDoCmd.TransferText メソッドでエクスポートする。
フォームのFilterプロパティに抽出条件を設定して、フィルタリングする。
VBAでクエリのWHERE句をフォームのFilterプロパティで書き換える。
このクエリをDoCmd.TransferText メソッドでエクスポートする。
前者は、シンプルですが対象フィールドが複数になると条件が複雑になりがちです。(PCTipsさんのリンク先参照)
魔法使いの開発工房さんの方法(=りんごさんの回答)は、割とシンプルですが、Null値のレコードは抽出されません。(それでも問題ない、あるいはNull値はないないら、これでいいでしょう。)現状は、フォームのFilterプロパティに抽出条件を設定しているのて、2.の方法のサンプルを提示しておきます。
クエリ1 はWHERE句のないシンプルなもの。
事前にクエリ1でエクスポートして、エクスポート定義を作成しておく。
エクスポート定義で、タブ区切り、やデータ型などを設定する。
魔法使いの開発工房さんところのはフィールドで
True
/False
を作る手法なのでNullなレコードも抽出対象ですよ(抽出条件はTrue
だけ)あ!よくみたら、りんごさんの式とは違いましたね。
ただ、この方法はインデックスが無効になるので、データ数が多いときは、避けたい方法ですね。
(フィールドが関数内に入っているので)
抽出条件でインデックスが無効になる場合 - hatena chips
みなさまありがとうございます!
今、hirotonさんに教えて頂いた魔法使いの開発工房さんのやつをやってみて、できました!
今後データ件数はかなり増えることが予想されるので、りんごさん、hatenaさんのご提案もこれから試してみます!
こちらのサイトは本当に勉強になります!
ありがとうございました!