柔軟に働き方を選ぶ時代に必要なこと >>

フォーム[F_MENU]に非連結のテキストボックス検索用A~Cで3つあります。
検索用A
検索用B
検索用C

AかつBかつCという全件一致でフィルターをかけてフォーム[詳細]を開きたいのですが

DoCmd.OpenForm "F_詳細", , , "A = '" & Forms!F_MENU!検索用A & "'" And "B = '" & Forms!F_MENU!検索用B & "'" And "C = '" & Forms!F_MENU!検索用C & "'"

とやると、実行時エラー'13':型が一致しません。
と出てしまいます。

Aだけ、Bだけ、Cだけ、それぞれひとつずつ書けば、エラーなく結果が得られます。
DoCmd.OpenForm "F_詳細", , , "A = '" & Forms!F_MENU!検索用A & "'"
DoCmd.OpenForm "F_詳細", , , "B = '" & Forms!F_MENU!検索用B & "'"
DoCmd.OpenForm "F_詳細", , , "C = '" & Forms!F_MENU!検索用C & "'"

おそらくANDの使い方が誤っていると思うのですが、添削お願いいたします。
全てのテキストボックス及び元テーブルのデータ型はテキスト型です。

条件は3つとも完全一致のみで、検索用ABC、F_詳細のABCそれぞれのカラムにNULL値はありません。

よろしくお願いします。

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

A 回答 (1件)

And の扱いがおかしいですね。


DoCmd.OpenForm "F_詳細", , , "A = '" & Forms!F_MENU!検索用A & "' And B = '" & Forms!F_MENU!検索用B & "' And C = '" & Forms!F_MENU!検索用C & "'"
じゃないですか。

Docmd.Openform のWhereConditionのところは
Forms!F_MENU!検索用A が "いろは"
Forms!F_MENU!検索用B が "にほへと"
Forms!F_MENU!検索用C が "ちりぬるを"
だったとしたら、Accessに渡された時には
A='いろは' And B='にほへと' And C='ちりぬるを' にならねばなりません。

条件が長ったらしい時はどこが間違っているのか分からない時がありますので
いったん変数にセットして
Dim tStr as string
tStr = "A = '" & Forms!F_MENU!検索用A & "' And B = '" & Forms!F_MENU!検索用B & "' And C = '" & Forms!F_MENU!検索用C & "'"
Debug.print tStr でイミディエイトウィンドウに出力して確かめていたりします。
んで、
DoCmd.OpenForm "F_詳細", , , tStr
とすることもあり。
    • good
    • 0
この回答へのお礼

ありがとうございます。
まだまだ勉強中ですので、またお世話になるかとおもいますが、よろしくお願いします。

お礼日時:2014/07/31 14:17

この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の複数抽出方法を教えてください!

いつもお世話になっております。
あるテーブルに対して、フォームを作成しまし、県名(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アクセスでのテキストボックスの複数条件での抽出

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の完全一致ではありません。

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つの抽出条件を満たすレコ...続きを読む

Aベストアンサー

わかった。

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

これで分かるでしょう。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESS で マクロの中でフィルタを使用する方法

ACCESS初心者です
フォームを使用してテーブルのデータを単にマクロでフィルタ実行をかけて検索をしたいのですが、where条件式のところで文字列をあいまい検索したいのです。(フォームでテーブルの項目の一部を入力して検索をかけたい)like * を使用したいのですが記述の方法がわかりません。教えてください。
よろしくお願いいたします!

Aベストアンサー

No.2です。

> 現在[顧客マスタ]![顧客カナ]=[Forms]![顧客情報検索]![顧客カナ] と式を入れている

「顧客情報検索」フォームの「顧客カナ」コントロールの値であいまい検索をしたい、ということですね。
でしたら、以下のように変えれば可能になると思います。

現在:
[顧客マスタ]![顧客カナ]=[Forms]![顧客情報検索]![顧客カナ]
変更後:
[顧客マスタ]![顧客カナ] Like "*" & [Forms]![顧客情報検索]![顧客カナ] & "*"


これで、「顧客カナ」に入力した文字列を含むものを検索できます。
なお、「先頭一致/後方一致をユーザーが選択できるようにしたい」という場合は、

変更後:
[顧客マスタ]![顧客カナ] Like [Forms]![顧客情報検索]![顧客カナ]

としておいた上で、ユーザーに「*」を含めて入力してもらう、というのが、プログラムを
組む側としては一番簡単かと思います。
(「モリ」を含む場合は「*モリ*」、「モリ」で始まる場合は「モリ*」、「モリ」で終わる場合は
 「*モリ」、「モリ」の完全一致の場合は「モリ」と、それぞれ入力してもらいます)

No.2です。

> 現在[顧客マスタ]![顧客カナ]=[Forms]![顧客情報検索]![顧客カナ] と式を入れている

「顧客情報検索」フォームの「顧客カナ」コントロールの値であいまい検索をしたい、ということですね。
でしたら、以下のように変えれば可能になると思います。

現在:
[顧客マスタ]![顧客カナ]=[Forms]![顧客情報検索]![顧客カナ]
変更後:
[顧客マスタ]![顧客カナ] Like "*" & [Forms]![顧客情報検索]![顧客カナ] & "*"


これで、「顧客カナ」に入力した文字列を含むものを検索できます。
なお...続きを読む

Qアクセス フォーム複数条件でのフィルタエラーになる

アクセスのフォームにたいして

Private Sub Form_Load()
With Me.Form
.Filter = "分類 = '" & "クレジットカード" & "' and " _
& "退会済YesNo = '-1'"
.FilterOn = True
End With
End Sub

とすると、

抽出条件でデータ型が一致しません。(エラー 3464)

と言うエラーになってしまいますが、
分類フィールドの値がクレジットカードで、なおかつ退会済YesNoフィールドの値が-1(もしくはTrue)を抽出するにはどうすればいいですか?

あと、エラーになる原因も教えていただければ幸いです。
ご回答よろしくお願いします。

Aベストアンサー

No1です。フィールド名が・・・
退会済YesNoでしたね。


.Filter = "分類 = 'クレジットカード' And 退会済YesNo = -1"

Qアクセスのフォームで期間検索するには?

アクセスの検索フォームで、レコードを別フォームで表示して、表示したフォームでフィールド毎に検索しています。

日付の部分だけ、検索方法が分からず、なかなか出来ない状態です。

このフォームに、開始と終了のテキストボックスを設置しています。
ボタンを押して、開始と終了の期間のデータを表示出来ればと思います。

宜しくお願いします。

Aベストアンサー

>日付フィールドは、日付/時刻型でyyyy/mm/ddで入力しています。
ということですから

Private Sub 期間検索_Click()

Me.Filter = "日付 Between #" & Me.[開始] & "# And #" & Me.[終了] & "#"
Me.FilterOn = True

End Sub

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

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...続きを読む


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

人気Q&Aランキング

おすすめ情報