Microsoft Access 掲示板

フォームでフィルタリングしたデータをエクスポートしたい

8 コメント
views
4 フォロー

お世話になります。

分割フォームでフィルタリングしたデータをタブ区切りのテキストファイルにエクスポートしたいです。
ほぼほぼ下記でやろうとしてることと同じです。
https://oshiete.goo.ne.jp/qa/4340421.html
上記ベストアンサーにあるとおり、フォームと同じ絞込みをするクエリを作ればよいことは分かったのですが、
フォームには対象フィールドの異なるコンボボックスが2つあり、コンボボックスAが空白だった場合、フィルター条件から外しています。この場合はクエリの抽出条件をどのように書けばよいの分かりません。

試しに以下のように書いてみたのですが、クエリの結果はレコードが1件も表示されません。
IIf([Forms]![txt出力]![コンボボックスA]="",Like "*",[Forms]![txt出力]![コンボボックスA])

そもそもクエリの抽出条件を付加したり、外したりといった分岐ができるのでしょうか?
よろしくお願いいたします。

Kanto
作成: 2022/06/02 (木) 11:31:44
最終更新: 2022/06/02 (木) 14:52:39
通報 ...
1

フォームでのフィルタリングはどのようにしているのでしょうか。

レコードソースのクエリに抽出条件を設定している。
あるいは、
フォームのフィルター機能を使っている。

フォームには対象フィールドの異なるコンボボックスが2つあり、コンボボックスAが空白だった場合、フィルター条件から外しています。

これは、どのように実現しているのでしょうか。
それとも、この設定方が分からないということでしょうか。

2
Kanto 2022/06/02 (木) 14:48:02 e48ae@6eb0c

フォームのフィルターは以下をボタンに埋め込んでいます。

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ファイルにエクスポートしようとしています。
よろしくお願いします。

3
hiroton 2022/06/02 (木) 14:48:54 b3eaf@f966d

よくある手法
【Access】複数テキストボックスが空の場合は無視して値がある時だけ抽出できるクエリってできないの?(PCTipsさん)

汎用性の高い手法
MS-Access97超入門>絞込みの仕組みを作る(魔法使いの開発工房さん)

VBAで動的にクエリを作るとか、フォームのデータを直接テキストファイルとして吐き出す(VBA)とかもありますね

そもそもクエリの抽出条件を付加したり、外したりといった分岐ができるのでしょうか?

VBAで動的にクエリを作るならできます

4
りんご 2022/06/02 (木) 21:52:13 c564b@0e907

IIf([Forms]![txt出力]![コンボボックスA]="",Like "*",[Forms]![txt出力]![コンボボックスA])

Like IIf(IsNull([Forms]![txt出力]![コンボボックスA]),"*",[Forms]![txt出力]![コンボボックスA])

試してないから失敗したら、ごめんなさい。

5
hatena 2022/06/03 (金) 13:55:36 修正

方法としては、主に下記の2つになります。

  1. クエリで抽出条件を設定する。そのクエリをフォームのレコードソースにして、再クエリで抽出条件を反映させる。
    このクエリをDoCmd.TransferText メソッドでエクスポートする。

  2. フォームのFilterプロパティに抽出条件を設定して、フィルタリングする。
    VBAでクエリのWHERE句をフォームのFilterプロパティで書き換える。
    このクエリをDoCmd.TransferText メソッドでエクスポートする。

前者は、シンプルですが対象フィールドが複数になると条件が複雑になりがちです。(PCTipsさんのリンク先参照)
魔法使いの開発工房さんの方法(=りんごさんの回答)は、割とシンプルですが、Null値のレコードは抽出されません。(それでも問題ない、あるいはNull値はないないら、これでいいでしょう。)

現状は、フォームのFilterプロパティに抽出条件を設定しているのて、2.の方法のサンプルを提示しておきます。

'Microsoft Office XX.X Access Database Engine Object Library に参照設定必用
Private Sub エクスポートボタン_Click()
    Dim db As DAO.Database
    Dim qd As DAO.QueryDef
    Dim strFilter As String
    Dim strSQL As String

    'フィルターが設定されてなかったら実行しない
    If Me.Filter = "" Or Me.Filter = "False" Then Exit Sub

    'クエリのSQLにWHERE句を追加
    Set qd = db.QueryDefs("クエリ1")
    strSQL = Replace(qd.SQL, ";", "")
    qd.SQL = strSQL & " WHERE " & Me.Filter & ";"

    'テキストエクスポート
    DoCmd.TransferText acExportDelim, "エクスポート定義1", "クエリ1", _
             "C:\Test\Output.txt"

    'クエリのSQLを元に戻す
    qd.SQL = strSQL & ";"
End Sub

クエリ1 はWHERE句のないシンプルなもの。
事前にクエリ1でエクスポートして、エクスポート定義を作成しておく。
エクスポート定義で、タブ区切り、やデータ型などを設定する。

6
hiroton 2022/06/03 (金) 14:37:33 4c8c1@f966d >> 5

魔法使いの開発工房さんところのはフィールドでTrue/Falseを作る手法なのでNullなレコードも抽出対象ですよ(抽出条件はTrueだけ)

7

あ!よくみたら、りんごさんの式とは違いましたね。

ただ、この方法はインデックスが無効になるので、データ数が多いときは、避けたい方法ですね。
(フィールドが関数内に入っているので)

抽出条件でインデックスが無効になる場合 - hatena chips

8
Kanto 2022/06/06 (月) 17:18:14 e48ae@6eb0c

みなさまありがとうございます!
今、hirotonさんに教えて頂いた魔法使いの開発工房さんのやつをやってみて、できました!
今後データ件数はかなり増えることが予想されるので、りんごさん、hatenaさんのご提案もこれから試してみます!

こちらのサイトは本当に勉強になります!
ありがとうございました!