はじめての親子ハイキングに挑戦!! >>

Private Sub 検索_Click()

Dim strFilter1 As String
Dim strFilter2 As String
Dim strFilter3 As String

strFilter1 = "学校名 = '" & 学校名1 & "'"
strFilter2 = "学校区分 = '" & 学校区分1 & "'"
strFilter3 = "キャンパス = '" & キャンパス1 & "'"
Me.Filter = strFilter1 & " or " & strFilter2 & " or " & strFilter3


Me.FilterOn = True

End Sub


(1)学校名・(2)学校区分・(3)キャンパスと3つのテキストボックスがあり
3つの抽出条件を満たすレコードをフォームに表示させたいのですが
学校名を仮に早稲田大学といれ絞れるのですが次に学校区分を大学
と入れるとほか大学も抽出されてしまいます。

学校名を抽出させたら、その範囲で学校区分の大学を抽出させたいのですが
どのようにすればいいのでしょうか?
(1)のみの抽出の場合や(1)と(2)のみの
場合があるのでandの完全一致ではありません。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

わかった。



フォームモジュールの先頭
Option Compare Database
の次の行に
Option Explicit

これで分かるでしょう。
    • good
    • 0
この回答へのお礼

bonaronさん
Option Explicitをつけたら、実行できるようになりました!
ありがとうございます。
ただ、当初質問した条件通りには抽出できませんでした。。
hatenaさん細かくありがとうございました。

お礼日時:2010/12/15 11:24

No6 です。


To hatena さん
失礼しました。
大丈夫ですね。
    • good
    • 0

hatena さん お疲れのようですね。



>> 何もイミディエイトウィンドウには記載はありませんでした。。

>  If 学校名1 <> "" Then

Null チェック が必要かと。 ^^;
    • good
    • 0

> 何もイミディエイトウィンドウには記載はありませんでした。



それでは、下記の手順を試してください。

フォームをデザインビューで開き、「検索」コマンドボタンの「クリック時」プロパティに、[イベント プロシージャ] と設定されている確認。

設定されていたら、右端のビルドボタンをクリックして、VBAウィンドウが開き、Private Sub 検索_Click() のコードが表示されるか確認。

表示されたら、下記のように MsgBox のコードを挿入。


Private Sub 検索_Click()

  Dim strFilter As String

MsgBox "検索_Click!"
  If 学校名1 <> "" Then
    strFilter = " And 学校名 = '" & 学校名1 & "'"
  End if
  If 学校区分1 <> "" Then
    strFilter = strFilter & " And 学校区分 = '" & 学校区分1 & "'"
  End If
  If キャンパス <> "" Then
    strFilter = strFilter & " And キャンパス = '" & キャンパス1 & "'"
  End If

MsgBox "strFilter='" & strFilter & "'"

  Me.Filter = Mid(strFilter1, 6)
  Me.FilterOn = (strFilter <> "")

End Sub

フォームビューにして、学校名1、学校区分1、キャンパス1 に何か入力して、
検索ボタンをクリック。

MsgBox 2回表示されるか確認。

表示されるなら、表示された内容を押して得てください。
    • good
    • 1
この回答へのお礼

<フォームをデザインビューで開き、「検索」コマンドボタンの「クリック時」プロパティに、[イベント プロシージャ] と設定されている確認。
<設定されていたら、右端のビルドボタンをクリックして、VBAウィンドウが開き、Private Sub 検索_Click() のコードが表示されるか確認。
↑こちら確認済みです。詳細な説明ありがとうございます。

そして標記のコードを貼り付け実行させ、2回ほどメッセージがでたので
2回クリックしましたが、実行結果はテキストボックスに入れた内容で抽出されず
何も変化はありませんでした。。

m3_maki さんもNo7で仰られているように実行には問題ないみたいですね。。
う。。何がいけないのでしょうか。。

お礼日時:2010/12/15 02:14

> いわれた通りデバックからコードを貼り付けてみました。



それでは、そのフォームを開いて、検索ボタンを押してから、
キーボードの Ctrl + G を押してください。
VBAウィンドウが開きまずので、そこのイミディエイトウィンドウに
何か表示されてますか。
表示されていたら、それをコピーしてこの掲示板に貼り付けてください。
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
何もイミディエイトウィンドウには記載はありませんでした。。

お礼日時:2010/12/14 09:37

前回の回答のコードにタイプミスがありましたので、下記に修正してください。



Private Sub 検索_Click()

  Dim strFilter As String


  If 学校名1 <> "" Then
    strFilter = " And 学校名 = '" & 学校名1 & "'"
  End if
  If 学校区分1 <> "" Then
    strFilter = strFilter & " And 学校区分 = '" & 学校区分1 & "'"
  End If
  If キャンパス <> "" Then
    strFilter = strFilter & " And キャンパス = '" & キャンパス1 & "'"
  End If

  Me.Filter = Mid(strFilter1, 6)
  Me.FilterOn = (strFilter <> "")

End Sub


これで、うまくフィルタが掛からない場合は、上記の、End Sub の前に、

Debug.Print Me.Filter

というデバック用コードを挿入して実行してみてください。
検索ボタンをクリックした後、Ctrl+G でイミディエイトウィンドウを表示させ、そこに表示された文字列をコピーしてここに貼り付けてもらえますか。
    • good
    • 0
この回答へのお礼

hatena1989さん、返信ありがとうございます。
とりあえず、再度実行してみたのですが動きません。
いわれた通りデバックからコードを貼り付けてみました。

Private Sub 検索_Click()


Dim strFilter As String


If 学校名1 <> "" Then
strFilter = " And 学校名 = '" & 学校名1 & "'"
End If
If 学校区分1 <> "" Then
strFilter = strFilter & " And 学校区分 = '" & 学校区分1 & "'"
End If
If キャンパス <> "" Then
strFilter = strFilter & " And キャンパス = '" & キャンパス1 & "'"
End If

Me.Filter = Mid(strFilter1, 6)
Me.FilterOn = (strFilter <> "")



'Me.FilterOn = True
Debug.Print Me.Filter


End Sub

お礼日時:2010/12/13 18:59

> (1)のみの抽出の場合や(1)と(2)のみの


> 場合があるのでandの完全一致ではありません。

Or条件でもないですね。
And 条件の場合分けでしょうね。

下記のコードでいかがですか。

Private Sub 検索_Click()

Dim strFilter As String


If 学校名1 <> "" Then
strFilter = " And 学校名 = '" & 学校名1 & "'"Eend if
If 学校区分1 <> "" Then
strFilter = strFilter & " And 学校区分 = '" & 学校区分1 & "'"
End If
If キャンパス <> "" Then
strFilter = strFilter & " And キャンパス = '" & キャンパス1 & "'"
End If

Me.Filter = Mid(strFilter1,5)
Me.FilterOn = (strFilter <> "")

End Sub
    • good
    • 0
この回答へのお礼

hatena1989 さん
ご回答ありがとうございます。
プログラムの内容は大まかには理解できたのですが
ボタンをクリックしても何も抽出されません。

お礼日時:2010/12/13 02:39

要求する仕様が良く分からないのです。


「早稲田」or「大学」で、他の大学が出てくるのは当然だと思いますし、それが「学校名を抽出させたら、その範囲で学校区分の大学を抽出させたい」という仕様ではないのですか?
なんで「大学」という範囲のレコードを抽出するのに、「早稲田大学」も一緒に抽出条件する場合があるのかはよく分かりませんが。

また、厳密に言うと「その範囲で学校区分の大学」もよく意味が分かりません。こんな掲示板に書いているのですから、別にきっちりかっちり書けといっているわけではありません。ただ、要求する動作がきちんと定義されていないのではないか、という印象をもちました。
フィルターの使い方という話ではなくて、そもそもデータベースの設計、というかデータの整理の仕方、運用の仕方に問題があるのではないですか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qaccessvba 複数条件でFilterをしたい

テーブル1
---------------------------------------
IDフィールド1フィールド2
1あA
2いB
3うC
4えD
5おE
---------------------------------------
を作成し、そのテーブルをもとに、帳票フォームを作成しました。

そのフォームに非連結のテキストボックス
ID_テキスト
フィールド1_テキスト
フィールド2_テキスト
3つを設置しました。

行いたい事をクエリ(SQL文)で例えると、
---------------------------------------
SELECT テーブル1.ID, テーブル1.フィールド1, テーブル1.フィールド2
FROM テーブル1
WHERE (((テーブル1.ID) Like "*" & Forms!テーブル1!ID_テキスト & "*") And ((テーブル1.フィールド1) Like "*" & Forms!テーブル1!フィールド1_テキスト & "*") And ((テーブル1.フィールド2) Like "*" & Forms!テーブル1!フィールド2_テキスト & "*"));
---------------------------------------
なのですが、
これをクエリを作成せずに、VBAで行いたいです。

各非連結のテキストボックスには、
更新後処理:[イベント プロシージャ]
としています。
---------------------------------------
Private Sub ID_テキスト_AfterUpdate()
Me.Form.Filter = _
"ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'"
Me.Form.FilterOn = True
End Sub
---------------------------------------
は、問題なくできるのですが、

Private Sub ID_テキスト_AfterUpdate()
Me.Form.Filter = _
"ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'" and & _
"フィールド1 like '" & "*" & Me.フィールド1_テキスト.Value & "*" & "'"
Me.Form.FilterOn = True
End Sub

にすると、エラーになります。
andの繋げ方が良くないと思うのですが、どうすればいいでしょうか?

最終的には、

Private Sub ID_テキスト_AfterUpdate()
Me.Form.Filter = _
"ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'"
"フィールド1 like '" & "*" & Me.フィールド1_テキスト.Value & "*" & "'"
"フィールド2 like '" & "*" & Me.フィールド2_テキスト.Value & "*" & "'"
Me.Form.FilterOn = True
End Sub

のような感じにしたいです。
ご回答よろしくお願いします。

テーブル1
---------------------------------------
IDフィールド1フィールド2
1あA
2いB
3うC
4えD
5おE
---------------------------------------
を作成し、そのテーブルをもとに、帳票フォームを作成しました。

そのフォームに非連結のテキストボックス
ID_テキスト
フィールド1_テキスト
フィールド2_テキスト
3つを設置しました。

行いたい事をクエリ(SQL文)で例えると、
---------------------------------------
SELECT テーブル1.ID, テーブル1.フィールド1, テーブル1.フィールド2
FROM テーブ...続きを読む

Aベストアンサー

Private Sub ID_テキスト_AfterUpdate()
Me.Form.Filter = _
"ID like '" & "*" & Me.ID_テキスト.Value & "*" & "' and " _
& "フィールド1 like '" & "*" & Me.フィールド1_テキスト.Value & "*" & "'"
Me.Form.FilterOn = True
End Sub
でしょ。

QACCESSのフォーム上で複数検索したい項目がある場合どうすればいいですか?

(1)部品ID
(2)日付
(3)入庫か出庫 
以上3つを検索したいのですがどうすればいいでしょうか?

(1)の部品IDはリストBOXの一覧から選択し、選択したものをテキストBOXに表示させるという形で作成しました。
(2)の日付はテキストBOXに手入力という形です。
(3)の入庫か出庫はコンボBOXで選択するという形です。

検索ボタンを作成してクエリの更新をかけて表示したいと思うのですが、3つの条件のうちその時により、全ての検索条件を入力しなくても1つでも条件を入力するとその条件が表示させるようにさせたいのです。

あと、何も条件を入力せず、検索ボタンを押すと全てのデータが表示させれるようにもしたいのです。

どのようなコードを記述すればいいでしょうか?
よろしくおねがいします

Aベストアンサー

>”このオブジェクトに値を代入することはできません”と表示され・・
失礼しました。フィルターのセットで最後が足りませんでした。あと[このオブジェクトに値を代入・・]のメッセージは抽出等で間違った指定方法をしているという事なのですが・・。
多分日付の抽出の仕方だと思いますので日付抽出のセットを少し変えましたのでメインフォーム上のボタンCmd1のクリック時のイベントを下記に変更してみてください。

Private Sub Cmd1_Click()
Dim MyCriteria As String

MyCriteria = "日付 ="
If IsNull(Text2) Then
MyCriteria = MyCriteria & True
ElseIf Not IsNull(Text2) Then
MyCriteria = MyCriteria & "#" & Me!Text2 & "#"
Else
End If

strfilter = MyCriteria
strfilter = strfilter & " And 部品ID Like '*" & Me.Text1.Value & "*' And 区分 Like '*" & Me.Cmb1.Value & "*'"

Forms!フォーム名!サブフォーム名.Form.Filter = strfilter
Forms!フォーム名!サブフォーム名.Form.FilterOn = True
Forms!フォーム名!サブフォーム名.Requery

End Sub

メインフォーム上のテキストボックスやコンボの値をサブフォームのフィルターに代入するときはMe!Text1の指定で良さそうなので上記でサブフォームにフィルターをかけられます。(試したらフィルターかけられました。)
これでどうでしょう。

>”このオブジェクトに値を代入することはできません”と表示され・・
失礼しました。フィルターのセットで最後が足りませんでした。あと[このオブジェクトに値を代入・・]のメッセージは抽出等で間違った指定方法をしているという事なのですが・・。
多分日付の抽出の仕方だと思いますので日付抽出のセットを少し変えましたのでメインフォーム上のボタンCmd1のクリック時のイベントを下記に変更してみてください。

Private Sub Cmd1_Click()
Dim MyCriteria As String

MyCriteria = "日付 ="
If IsNull(T...続きを読む

QAccessで別テーブルの値をフォームに表示したい

初めてのAccessで分からない事があり質問させてください。

<会社テーブル>
会社ID
会社名
住所

<社員テーブル>
会社ID
社員名
ソート番号

*1社に対し複数の社員レコードが存在

以上のようなテーブルがあるとします

現在「会社テーブル」を表形式で一覧表示しています
会社ID,会社名、住所とフィールドが並んでいるのですが、その後ろに「社員テーブル」のソート番号が一番若い社員名を表示したいと考えています(現状は番号関係なく表示させる方法すら分かりません)

色々いじくりまわしたのですが、初めてAccessをさわる事もあってよくわかりません

リレーション等でひっぱってくる事ができるのでしょうか?

どなたか教えて頂けませんでしょうか

何卒よろしくお願い致します

PS.Access2013で作成中です

Aベストアンサー

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FROM 社員
ORDER BY 社員.ソート番号;

2、コントロールソースに次のように書きます。

=DLookUp("社員名","社員ソートクエリ","会社ID=" & [会社ID])

http://office.microsoft.com/ja-jp/access-help/HA001228825.aspx

DLookup()については、マイクロソフトの解説を参照されてください。

【DLookup()の限界を破るにはVBAで同じ関数を作るしかない】

マイクロソフトの解説を読めば判りますが、ORDER BY 節を指定する引数が用意されていません。ですから、どうしても、"社員ソートクエリ"を作成するという手間が必要となります。そこで、SQL文を引数とするDBLookup()をVBAで書けば、その手間を省けるという算段になります。この辺りは、好みと趣味の問題。どっちでも良いと思います。そういうお断りをした上で DBLookup()を紹介しておきます。なお、ADOは、つぎのように参照設定しないと利用できません。

http://www.happy2-island.com/access/gogo03/capter00307.shtml

Public Function DBLookup(ByVal strQuerySQL As String, _
             Optional ByVal ReturnValue = Null) As Variant
On Error GoTo Err_DBLookup
  Dim DataValue
  Dim rst     As ADODB.Recordset

  Set rst = New ADODB.Recordset
  With rst
    .Open strQuerySQL, _
       CurrentProject.Connection, _
       adOpenStatic, _
       adLockReadOnly
    If Not .BOF Then
      .MoveFirst
      DataValue = .Fields(0)
    End If
  End With
Exit_DBLookup:
On Error Resume Next
  rst.Close
  Set rst = Nothing
  DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)
  Exit Function
Err_DBLookup:
  MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & Err.Description & Chr$(13) & _
      "・SQL Text=" & strQuerySQL, _
      vbExclamation, " 関数エラーメッセージ"
  Resume Exit_DBLookup
End Function

単純にテーブル[会社]のみでフォームを作成し、社員表示用テキストボックスを追加。そして、そのプロパティを表示し

コントロールソース=DBLookup("SELECT 社員名 FROM 社員 WHERE 会社ID=" & [会社ID] & " ORDER BY ソート番号")

これは、以下の標準モジュールに登録したユーザ関数 DBLookup()を使っています。これで、クエリを用意しなくても目的を達成できます。

さて、かかるユーザ関数を標準ライブラリに登録したくない場合、

1、"社員ソートクエリ"を作成します。

SELECT 社員.会社ID, 社員.社員名
FR...続きを読む

QACCESSでフォームを使って、テーブルを参照、データ入力、データ更新をしたいのです

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入力画面
       ↓
レコード番号を入れると、そのレコードのデーターが画面に表示され、
その画面で修正可能
       ↓
 保存 ボタンで保存

という流れです。

レコードナンバーはIDを使おうと思っています。

データの量が莫大な為、コンポボックスなどは使えません。

できるだけ、VBAなどは使わずに作りたいです。

よろしくお願い致します。

フォームを使って、テーブルを参照、データ入力、データ更新をしたいのです。

売上テーブル

 ID   商品コード  日付    金額 
 1    G1     20080101  532153
 2    G1     20080101  564281
 3    G1     20080301  538123
 4    J4     20080301  124531
 5    J4     20080302  125483

ID:オートナンバー 商品コード:数値型 日付:数値型 金額:数値型

これを使い、
フォームではまず

レコードナンバーを入...続きを読む

Aベストアンサー

まずそのテーブルを基にしてフォームを作成します。
そのフォームのヘッダー部分にテキストボックスを配置後、一旦
上書き保存。
フォームのレコードソースを
SELECT *
FROM テーブル名 WHERE ID=[Forms]![フォーム名]![テキストボックス名]
とします。
次にテキストボックスの更新後処理に
Me.Requery
とすれば完成です。
フォームを開いてテキストボックスにID入力後エンターしてください。

保存に関しては、コマンドボタン作成後クリック時イベントに
DoCmd.RunCommand acCmdSaveRecord
とすれば良いでしょう。

この手のモノは検索すれば相当数ヒットするので、そちらを参考にされるのもよろしいかと。

QACCESSの複数抽出方法を教えてください!

いつもお世話になっております。
あるテーブルに対して、フォームを作成しまし、県名(txtbox_県名1)で絞込み抽出を行いたいと思い、以下のVBAで抽出はOKでした。

Me.Filter = "[県名] Like '*" & txtbox_県名1 & "*'"

しかし、県名に対して1つの条件の場合うまくいくのですが、2つの条件の場合、どうやるのかが分かりません。(同じ県名に対して、2つの条件)
教えてください。よろしくお願いします。

Aベストアンサー

例えばtxtbox_県名1 と txtbox_県名2 に格納されている文字のどちらかを含む県を列挙したければ
"( [県名] Like '*" & txtbox_県名1 & "*' and [県名] Like '*" & txtbox_県名2 & "*' )"
とでもしておけばいいのではないでしょうか?

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QアクセスのテキストボックスでOR条件の設定をしたい

抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力するとOR条件で抽出出来る様にしたいと思っています。

F_抽出←抽出用フォーム
syurui←非連結のテキストボックス名
抽出←コマンドボタン

T_データ
番号(主キー)、氏名、住所、性別、種類(テキスト型)、・・・

F_結果←抽出条件を反映するフォームで、T_データの項目をすべてリスト形式で表示出来る様にしています。

色々調べてみて、下記の設定をしてみました。

Private Sub 抽出_Click()
Dim strFilter As String
strFilter = "*" & Replace(Me.syurui, " ", "* Or *") & "*"
strFilter = BuildCriteria("種類", dbText, strFilter)
DoCmd.OpenForm "F_結果", , , strFilter
End Sub

実行してみると、実行時エラー 2431 指定した式の構文が正しくありません。と表示されてしまいます。

4行目を下記に書換えてみたのですが、
strFilter = BuildCriteria([T_データ]![種類], dbText, strFilter)

実行してみると、実行時エラー 2465 指定した式で参照されている'|'フィールドがみつかりません。
と表示され、希望通りの結果が得られません。
アクセス初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますのでどうぞよろしくお願い致します。

抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力するとOR条件で抽出出来る様にしたいと思っています。

F_抽出←抽出用フォーム
syurui←非連結のテキストボックス名
抽出←コマンドボタン

T_データ
番号(主キー)、氏名、住所、性別、種類(テキスト型)、・・・

F_結果←抽出条件を反映するフォームで、T_データの項目をすべてリスト形式で表示出来る様にしています。

色々...続きを読む

Aベストアンサー

おじゃまします。

> 空白区切りで複数のキーワードを入力するとOR条件

この条件なら、エラーが無くなったとしてもこの方法は使わない方が良いと思います。

空白区切り、これは何文字の空白を想定されていますか。

エラーが無くなったとして、
あ(スペース)い
なら、種類 Like "*あ*" Or 種類 Like "*い*"
あ(スペース)(スペース)い
なら、種類 Like "*あ*" Or 種類 Like "**" Or 種類 Like "*い*"

条件間が AND であれば、途中の 種類 Like "**" は無視できると思いますが、
OR なら、NULL でないものすべてが抽出されます。

今回の場合は、
素直に Split を使って有効なもののみで条件を生成した方が良いと思います。

以下例)

  Dim sWhere As String
  Dim vTmp As Variant
  Dim i As Integer
  Const KouName As String = "種類" ' 条件となる項目名
  Const MOJI As String = "あ  い" ' テスト用文字列

  sWhere = ""
  vTmp = Split(MOJI, " ") ' ★
  For i = LBound(vTmp) To UBound(vTmp)
    If (Len(vTmp(i)) > 0) Then
      sWhere = sWhere & " OR ([" & KouName & "] Like '*" & vTmp(i) & "*')"
    End If
  Next
  If (Len(sWhere) > 0) Then sWhere = Mid(sWhere, 5)

最終的に生成される sWhere は、
([種類] Like '*あ*') OR ([種類] Like '*い*')
の様になります。
念のため、各条件を ( ) で、また項目名を [ ] で囲ってます。

最後の
  If (Len(sWhere) > 0) Then sWhere = Mid(sWhere, 5)
は、文字列が作られていれば
OR (・・・) OR (・・・) となっているので、(・・・) OR (・・・) に作り直しています。

★部分、カンマ区切りに変更する場合は、vTmp = Split(MOJI, ",") になります。
 MOJI はテスト用なので、ここにテキストボックスの値を指定します。
空白区切りの場合、スペースが続くと "" に展開されるので、有効なものなのかは
文字数で判別します。




> 4行目を下記に書換えてみたのですが、
> strFilter = BuildCriteria([T_データ]![種類], dbText, strFilter)

strFilter = BuildCriteria("[T_データ]![種類]", dbText, strFilter)

初めのパラメータはフィールド名になるので、文字列として指定します。

> F_結果←抽出条件を反映するフォームで、T_データの項目をすべて
ということなので、テーブル修飾は必要ないと思います。
strFilter = BuildCriteria("[種類]", dbText, strFilter)

> strFilter = BuildCriteria("種類", dbText, strFilter) の後で
> debug.print strFilterをすると何も表示されませんでした
この結果に対して、わかりません。

BuildCriteria は、テーブルとか確認するわけではない(と思う)ので、
指定されたもので条件を作り出すものになります。
ということで、
> したがって、"種類"が間違っている様に思うのですが
にはなりません。

間違うとすると、OpenForm 時に指定する条件記述が間違っていることになります。

そのフォームで指定できる条件の項目名は、
フォームをデザインビューで開き、連結したテキストボックスのプロパティを見てみます。
「コントロールソース」部分に表示されるものになります。
(Alt + ↓ で一覧で見ることができます)

おじゃまします。

> 空白区切りで複数のキーワードを入力するとOR条件

この条件なら、エラーが無くなったとしてもこの方法は使わない方が良いと思います。

空白区切り、これは何文字の空白を想定されていますか。

エラーが無くなったとして、
あ(スペース)い
なら、種類 Like "*あ*" Or 種類 Like "*い*"
あ(スペース)(スペース)い
なら、種類 Like "*あ*" Or 種類 Like "**" Or 種類 Like "*い*"

条件間が AND であれば、途中の 種類 Like "**" は無視できると思いますが、
OR なら...続きを読む

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

Qaccess マクロでのフィルタの解除の方法

フィルタをかける時は、

***************************
アクション:フィルタの実行
フィルタ名:なし
Where条件式:[フィールド1]="あ"
***************************

で、できますが、
フィルタを解除する時はどのようなマクロを作ればいいのでしょうか?

VBAでやるなら、
Me.Form.FilterOn = False
をマクロでやりたいです。

アドバイスよろしくお願いします。

Aベストアンサー

> VBAでやるなら、
> Me.Form.FilterOn = False
> をマクロでやりたいです。

ご質問の趣旨が「並べ替えは維持した状態で、フィルタだけ解除したい」という
ことでしたら、以下の方法で対応できます。


a)フィルタの解除専用の場合
***************************
アクション:コマンドの実行
コマンド:フィルタをすべて解除
***************************
※フィルタが適用されていない状態で実行するとエラーになります。
  (コマンドボタンで実行させる場合、フィルタ未適用時はボタンを使用不可
  にするか、マクロの『条件』欄に「~.FilterOn = True」の記述が必要、と)
  また、フォームのプロパティシートの『データ』タブにある『フィルタ』欄(VBAでの
  Me.Form.Filterに相当)に設定された文字列も削除されます。


b)フィルタの適用/解除を交互に切り替える場合
***************************
アクション:コマンドの実行
コマンド:フィルタの実行/解除
***************************
※当該フォームにフィルタが設定されていない場合、エラーとなります。
 (フォームのプロパティシートの『データ』タブにある『フィルタ』欄に
  フィルタとなる文字列が設定されていればOk:)
 (フィルタが適用済みなら解除、解除済みなら適用、となります)


因みに、マクロのデザインビューで、『デザイン』リボンの『表示/非表示』グループ
内にある『すべてのアクションを表示』をオンにしてもよいのでしたら、以下の
方法もあります。
(VBAでの方法をご存知の上でマクロで対応ということは、勤務先のセキュリティ
 方針によるものかと思いますので、この方法も不可かもしれませんが(汗))

***************************
アクション:値の代入
アイテム:Forms!フォーム名.Form.FilterOn
式:False
***************************

※サブフォームの場合の『アイテム』は以下のようになります:
 Forms!フォーム名!サブフォームコントロール名.Form.FilterOn

> VBAでやるなら、
> Me.Form.FilterOn = False
> をマクロでやりたいです。

ご質問の趣旨が「並べ替えは維持した状態で、フィルタだけ解除したい」という
ことでしたら、以下の方法で対応できます。


a)フィルタの解除専用の場合
***************************
アクション:コマンドの実行
コマンド:フィルタをすべて解除
***************************
※フィルタが適用されていない状態で実行するとエラーになります。
  (コマンドボタンで実行させる場合、フィルタ未適用時はボタンを使用不可
  にするか、...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング