Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1192 / 2272 ツリー ←次へ | 前へ→

【8339】複数条件の抽出について こまったちゃん 06/7/22(土) 22:11 質問[未読]
【8340】Re:複数条件の抽出について Gin_II 06/7/22(土) 23:24 回答[未読]
【8341】Re:複数条件の抽出について こまったちゃん 06/7/23(日) 1:57 質問[未読]
【8342】Re:複数条件の抽出について Gin_II 06/7/23(日) 18:24 回答[未読]
【8343】Re:複数条件の抽出について Gin_II 06/7/23(日) 18:26 発言[未読]
【8344】Re:複数条件の抽出について こまったちゃん 06/7/23(日) 18:55 質問[未読]
【8345】Re:複数条件の抽出について Gin_II 06/7/23(日) 22:16 回答[未読]

【8339】複数条件の抽出について
質問  こまったちゃん  - 06/7/22(土) 22:11 -

引用なし
パスワード
   ACCESSを始めたばかりで解らないところだらけです。宜しくお願いします。
今フォームから条件を入れてレコードの抽出をするツールを作っています。
クエリでしたら簡単に作成出来るのですがひとつ困った部分があります。

SELECT 抽出フォーム用.[日付], 抽出フォーム用.[部 門], 抽出フォーム用.Category
FROM 抽出フォーム用
WHERE (((抽出フォーム用.日付) Between [Forms]![検索用]![日付From] And [Forms]![検索用]![日付To]) AND ((抽出フォーム用.[部 門]) Like [Forms]![検索用]![部門] & "*") AND ((抽出フォーム用.Category) Like [Forms]![検索用]![カテゴリ1] & "*"));

上のSQL文で「Category」の抽出を「Category1」or「Category2」or「Category3」・・・と6つの条件指定をするように変えたいと思っています。
ただ、6つのうちいくつ指定するかはその都度違います。
あいまい検索の為「Category1〜6」のどれかがブランクだとすべてのレコードを抽出していまします。
IIF関数とISNULL関数で出来るのではと調べてみたのですが、6の6乗分の式を書かなくてならないようで実用的ではありません。
どのようにSQL文を変えればうまく動作するでしょうか?
ご指導宜しくお願いします。

【8340】Re:複数条件の抽出について
回答  Gin_II  - 06/7/22(土) 23:24 -

引用なし
パスワード
   > 上のSQL文で「Category」の抽出を「Category1」or「Category2」or
> 「Category3」・・・と6つの条件指定をするように変えたいと思っています。
> ただ、6つのうちいくつ指定するかはその都度違います。
> あいまい検索の為「Category1〜6」のどれかがブランクだとすべてのレコードを
> 抽出していまします。
> IIF関数とISNULL関数で出来るのではと調べてみたのですが、6の6乗分の式を
> 書かなくてならないようで実用的ではありません。
> どのようにSQL文を変えればうまく動作するでしょうか?

フォームの Filter プロパティを使って抽出しては?

Dim lngIdx As Long
Dim strWhere As String

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
        & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx

If Len(strWhere) > 0 Then
  Me.Filter = Mid(strWhere, 5)
  Me.FilterOn = True
End If

とかのように。

【8341】Re:複数条件の抽出について
質問  こまったちゃん  - 06/7/23(日) 1:57 -

引用なし
パスワード
   ▼Gin_II さん:
ご指導ありがとうございます。
VBAはよく理解していない為、教えて頂いた文をどのように書いて良いか解りません。Webで「フォームFilter」で検索してみたのですが自分のやりたい文に置き換えることが出来ません。
申し訳ありませんが、全体の文か参考になるURLを教えていただけないでしょうか?
お手数をお掛けします。宜しくお願いします。


>> 上のSQL文で「Category」の抽出を「Category1」or「Category2」or
>> 「Category3」・・・と6つの条件指定をするように変えたいと思っています。
>> ただ、6つのうちいくつ指定するかはその都度違います。
>> あいまい検索の為「Category1〜6」のどれかがブランクだとすべてのレコードを
>> 抽出していまします。
>> IIF関数とISNULL関数で出来るのではと調べてみたのですが、6の6乗分の式を
>> 書かなくてならないようで実用的ではありません。
>> どのようにSQL文を変えればうまく動作するでしょうか?
>
>フォームの Filter プロパティを使って抽出しては?
>
>Dim lngIdx As Long
>Dim strWhere As String
>
>For lngIdx = 1 To 6
>  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
>    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
>        & Me("カテゴリ" & lngIdx) & "*'"
>  End If
>Next lngIdx
>
>If Len(strWhere) > 0 Then
>  Me.Filter = Mid(strWhere, 5)
>  Me.FilterOn = True
>End If
>
>とかのように。

【8342】Re:複数条件の抽出について
回答  Gin_II  - 06/7/23(日) 18:24 -

引用なし
パスワード
   > SELECT 抽出フォーム用.[日付]
>    , 抽出フォーム用.[部 門]
>    , 抽出フォーム用.Category
> FROM 抽出フォーム用
> WHERE (((抽出フォーム用.日付) Between [Forms]![検索用]![日付From]
>                  And [Forms]![検索用]![日付To])
>  AND ((抽出フォーム用.[部 門]) Like [Forms]![検索用]![部門] & "*")
>  AND ((抽出フォーム用.Category) Like [Forms]![検索用]![カテゴリ1] & "*"));

このクエリの抽出条件をすべてはずしてください。
で、コマンドボタンを作成して、そのクリック時イベントで

Dim lngIdx As Long
Dim strWhere As String

If Not IsNull(Me!日付From) Then
  strWhere = strWhere & " AND 日付 >= #" & Me!日付From & "#"
End If

If Not IsNull(Me!日付To) Then
  strWhere = strWhere & " AND 日付 <= #" & Me!日付To & "#"
End If

If Not IsNull(Me!部門) Then
  strWhere = strWhere & " AND 部門 Like '" & Me!部門 & "*'"
End If

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
        & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx

If Len(strWhere) > 0 Then
  Me.Filter = Mid(strWhere, 5)
  Me.FilterOn = True
End If

のように記述してみてください。

【8343】Re:複数条件の抽出について
発言  Gin_II  - 06/7/23(日) 18:26 -

引用なし
パスワード
   >    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
                ~~~~~
全角スペースになっていますが、半角スペース×2 にしてください。

【8344】Re:複数条件の抽出について
質問  こまったちゃん  - 06/7/23(日) 18:55 -

引用なし
パスワード
   ▼Gin_II さん:
ご指導本当にありがとうございます。
早速試してみたのですが、Categoryフィールド(データ元のテーブル)は固定で、テキストボックス1〜6に入力した値はすべて、Categoryフィールドを参照したいのですが、このVBAを実行するとCategory1,Category2と1〜6の数字が入ってしまい、構文エラーになってしまいます。
下のように変更をしてみましたがうまくいきません。
変数「IngIdx」をCategoryの後に付けなくても自動的に1〜6が入ってしまうのでしょうか?

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category Like '" & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx
もうひとつ疑問点なのですが、Mid(strWhere, 5)はどのような意味でしょうか?
If Len(strWhere) > 0 Then
  Me.Filter = Mid(strWhere, 5)
  Me.FilterOn = True
何度も申し訳ありません。


>>    strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
>                ~~~~~
>全角スペースになっていますが、半角スペース×2 にしてください。

【8345】Re:複数条件の抽出について
回答  Gin_II  - 06/7/23(日) 22:16 -

引用なし
パスワード
   > 上のSQL文で「Category」の抽出を「Category1」or「Category2」or
> 「Category3」・・・と6つの条件指定をするように変えたいと思っています。

この、Category1,Category2 ・・・ は、フィールド名じゃないということですね?


> For lngIdx = 1 To 6
>   If Not IsNull(Me("カテゴリ" & lngIdx)) Then
>     strWhere = strWhere & " OR Category" & lngIdx & " Like '" _
>         & Me("カテゴリ" & lngIdx) & "*'"
>   End If
> Next lngIdx

For lngIdx = 1 To 6
  If Not IsNull(Me("カテゴリ" & lngIdx)) Then
    strWhere = strWhere & " OR Category Like '" _
        & Me("カテゴリ" & lngIdx) & "*'"
  End If
Next lngIdx

のように修正してみてください。


> もうひとつ疑問点なのですが、Mid(strWhere, 5)はどのような意味でしょうか?

ヘルプぐらいは確認しましょう。
それで分からなければ、再度質問してください。

Microsoft Office アシスタント: Mid 関数
http://office.microsoft.com/ja-jp/assistance/HP010432151041.aspx

1192 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078221
(SS)C-BOARD v3.8 is Free