OCNのモバイルに新コース登場!キャンペーン続々開催中

非連結のtxtBoxのデータをcmdボタンで検索

いつもお世話になります。<m(__)m>

「T顧客管理」を基に「F顧客管理入力」を作成し「F顧客管理入力」
には非連結の「txtBox」と「cmd検索」があります。
「T顧客管理」に追加クエリにて「商品管理_ID・管理番号・商品名」
が入力済みになっております。
そこで「txtBox」に管理番号を入力して「cmd検索」を押して検索
されたレコードに顧客のデータを入力したいのですが、レコードが
検索されません。

「cmd検索」のイベントに

Private Sub cmd検索_Click()
DoCmd.SearchForRecord , , acFirst, "管理番号 Like '*" & Me!txt検索 & "*'"
Me!txt検索 = Null
End Sub

としています。
追加クエリは

INSERT INTO T顧客管理 ( 商品管理_ID, 管理番号, 商品名 )
SELECT T商品説明.商品管理_ID, T商品説明.管理番号, T商品説明.商品名
FROM T商品説明
WHERE (((T商品説明.商品名) Is Not Null));

として「T商品説明」には、他にフィールドがいくつかあります。

--「T顧客管理」--

商品管理_ID ---- 数値型(主キー)
管理番号 ------- テキスト型
商品名 --------- テキスト型
販売日時 ------- 日付/時刻型
販売価格 ------- 通貨型
お名前 --------- テキスト型
 ・
 ・
 ・

-----------------
コード等間違いがありますでしょうか?
初歩的な事と思いますが宜しくお願い致します。<m(__)m>

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

A 回答 (2件)

> 教えて頂いたコードを書いて試してみましたら「該当するデータはありません。


> とメッセージが出てしまいます。

コードは正常に動作していると言うことですね。

txt検索に、実際に存在する管理番号を入力していますか。
ちゃんと入力しているのに「該当するデータはありません」と出るのなら、

"管理番号 Like '*" & Me!txt検索 & "*'"

の部分が間違っていることになります。

管理番号というフィールド名に間違いはないですか。
データ型はテキスト型で間違いないですか。

上記部分を、下記のように書き直した場合どうなるか試してもらえますか。

"管理番号 = '123456'"


123456 は実際に存在する管理番号で。
    • good
    • 0
この回答へのお礼

hatena1989 様

返答が遅くなりまして申し訳ありません。<m(__)m>
急に入院してしまったので・…

>"管理番号 Like '*" & Me!txt検索 & "*'"
>の部分が間違っていることになります。

ご回答のとおりコードを書き間違えていました。
コードを訂正しまして検索できるようになりました。
本当に初歩的なミスでお忙しいところ時間をとらせてしまい申し訳
ありません。
また質問等するかと思いますのでこれに懲りずに、宜しければまた
宜しくお願い致します。<m(__)m>

お礼日時:2010/12/06 08:02

DoCmd.SearchForRecord はAccess2007から追加されたメソッドですが、


Accessのバージョンは2007 または 2010 ですか。

当方の2007で試してみましたが、1回目は検索しますが、2回目から検索できないなど、どうも不安定です。

代わりに、Recordset.FindFirstメソッドを使えばどうでしょうか。

Private Sub cmd検索_Click()
  With Me.RecordSet
    .FindFirst "管理番号 Like '*" & Me!txt検索 & "*'"
    If .NoMatch Then MsgBox "該当するデータはありません。"
  End With
  Me!txt検索 = Null
End Sub
    • good
    • 0
この回答へのお礼

ご回答頂き有難うございます。<m(__)m>

>DoCmd.SearchForRecord はAccess2007から追加されたメソッドですが、
>Accessのバージョンは2007 または 2010 ですか。

Accessのバージョンは2010です。

>代わりに、Recordset.FindFirstメソッドを使えばどうでしょうか。

>Private Sub cmd検索_Click()
>  With Me.RecordSet
>    .FindFirst "管理番号 Like '*" & Me!txt検索 & "*'"
>    If .NoMatch Then MsgBox "該当するデータはありません。"
>  End With
>  Me!txt検索 = Null
>End Sub

教えて頂いたコードを書いて試してみましたら「該当するデータはありません。」
とメッセージが出てしまいます。

お礼日時:2010/11/27 11:11

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

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

関連するカテゴリからQ&Aを探す

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

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

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

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

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

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

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

Aベストアンサー

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

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

Qサブフォームに対してGoToRecordするには?

フォームに対してRequeryすると先頭のレコードへ移動してしまうので
Requeryする前のレコードの番号を取得して
Requery後にそのレコード番号へ移動したいのですが

Sub test()
i = Forms("Form").Controls("SubForm").Form.CurrentRecord
Forms("Form").Controls("SubForm").Requery
DoCmd.GoToRecord acActiveDataObject, Forms("Form").Controls("SubForm"), acGoTo, i
End Sub

これをすると、実行時エラー2498
指定した式は、いずれかの引数とデータ型が対応していません。
になりますが、
どこがおかしいのでしょうか?

Aベストアンサー

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現状・例2>
  Forms("Form").Requery
 <現状・例3>
  Forms("Form").Controls("SubForm").Form.Requery
 <代替策>
  Forms("Form").Controls("SubForm").Requery
  ※「現状・例3」との違い(→途中の「.Form」の有無)に注意。


【詳細】
> 実行時エラー2498

このエラーの直接の原因は、GotoRecordメソッドの第2引数に指定している
「Forms("Form").Controls("Subform")」の部分です。

ここに指定するのはオブジェクト名になりますが、そのデータ型は文字列型です。
一方、「~.Controls(~)」の形で指定した場合、取得できるのは
 a)オブジェクトそのもの
 b)そのオブジェクトのデフォルトプロパティ
のどちらかです(→状況によって変化します)。
(例えばテキストボックスなら、TextBoxオブジェクトまたはValueプロパティの値)

サブフォームのデフォルトプロパティは調べていませんが(汗)、少なくとも文字列
型のプロパティではないため、「型が一致しない」とのエラーとなります。
サブフォームのコントロール名を取得する場合は、
  Forms("Form").Controls("SubForm").Name
というように、Nameプロパティを明示的に指定する必要があります。

ただ、「サブフォームのレコード移動」の場合、明示的に「Name」プロパティを
指定しても解決には至りません(汗)
これは、GotoRecordメソッドの第2引数には、直接開いているオブジェクトの
名前のみが有効なためで、サブフォームを直接的に指定することはできない、
ということです。
(注:Microsoftの資料を探したわけではなく、経験則から記述していますので、
 私の勘違いでしたらご容赦願います(汗))

サブフォームのレコード移動には、冒頭に記述したとおり、「フォーカスの移動」と
「一部の引数を省略したGotoRecord」を使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

なお、これも冒頭に書きましたが、サブフォームのRequeryの仕方には幾つか
方法がありますが、Requeryの対象を「コントロールとしてのサブフォーム」にすれば、
レコード移動が発生しませんので、GotoRecord自体が不要になります。
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsFrmHowToRequeryAndReturn.html

【要旨】
サブフォームのレコード移動では、対象サブフォームは引数で指定するのではなく、
SetFocusメソッドで移動後、引数を省略したGotoRecordを使用します:
  Forms("Form").Controls("SubForm").SetFocus
  DoCmd.GotoRecord , , acGoto, i

但し、「Requery前後でのレコード移動の回避」が目的の場合は、Requeryの
対象を「親フォームまたはサブフォームのFormオブジェクト」ではなく「サブフォーム
コントロール」とすればOkです。
 <現状・例1>
  Forms("Form").SetFocus
  DoCmd.Requery
 <現...続きを読む

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

Qテキストボックスにクエリ結果を表示させたい

フォームにテキストボックスAがあり、そこに入力した文字(下記テーブルのフィールド1の文字)をクエリーの「抽出条件」にし、同じフォーム上のテキストボックスBに表示しようと思っています。

クエリを開くとパラメータの入力を求めてきて、入力するとうまく抽出されます。

テーブルは
フィールド1|フィールド2
  A   |  10
  B   |  20
  C   |  30
  D   |  40
のような簡単なものです。

テキストボックスBのコントロールソースに
「=[○×クエリ]![フィールド2]とやっても「#Name?」と表示されてしまいます。

どのようにやればよいのでしょうか?

Aベストアンサー

クエリは必要ありません。

フォームのレコードソースに無いデータを表示させる
場合には DLookUp を使います。

テキストボックスBのコントロールソースに
=DLookUp("フィールド2","テーブル名","フィールド1='" & [テキストボックスA]) & "'"

上記は「フィールド1」が文字列型の場合です。

数値型の場合は次のようになります。
=DLookUp("フィールド2","テーブル名","フィールド1=" & [テキストボックスA])

DLookUp 関数は コントロールソースに限らず
VBA でも使用し、Access では、非常に使用頻度の高いものです。

ヘルプで調べて、ぜひマスターしてください。

もし Access でなかったら、このレスは無視して下さい。

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

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アクセス: フォーム上で計算した数字をテーブルに保存したい。

 こんばんは。また質問させてもらいます・・。
これがアクセスに関して、最後の質問になるようにしたいです!!

 さて、フォームに入力したものは自動的にテーブルに保存されます。
しかし、フォーム上で計算したものは、テーブルに反映されていませんでした。
過去の質問にフォーム上計算したものは、テーブルに反映されないということがわかりました。
では、一体どうすればいいのでしょうか。

 フォームのコントロールソースには
=([QTY]*[COST]) 数量*値段を入れています。

どうすれば、テーブルに表示できるでしょうか。
ご教授お願いいたします。

過去の質問は、こちらを参考しました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1002073

Aベストアンサー

クエリーを覚えると便利です。
テーブル=オペレーターが入力したりする項目
クエリー=テーブルのデータプラスそれから計算出来るさまざまな項目

例えばQTYとCOSTはテーブルに
合計は 合計:[QTY]*[COST}
というようにクエリーに追加すれば、テーブルに
合計という項目を持つ必要がありません。
テーブルの「合計」を削除しても差支えありません。

また入力日という項目をテーブルに持ち
後の整理の目的でクエリーには
年:Year([入力日])
月:Month([入力日])
などとする事も可能です。

これで何年何月のデータだけを抽出したい場合でも
クエリーの抽出条件に 2004 とか 8(月)とかを
入力するだけでOKです。

合計、平均、最大、最小なども....

データベースはクエリーにあるレコードをいちいち保存するのではなく、計算式だけを覚えていて、開くたびに
計算して表示してくれるだけなのです。

Qアクセエスのレコードの更新をVBAでするには?

アクセスで、一覧表のフォームにボタンを取りつけています。レコードの内容を変更したら、ペンの形のマークが現れますね。これは変更中ということですが、そこでボタンを押しても変更は確定されないから、更新確定させたいのです。

それで、DoCmd.Requery を最初の行に入れてみたら、元の一覧表は最初のレコードに飛んでしまう。

元の一覧表の位置を動かさないために、Ctrl+Enter キーを押して更新確定させたような状態をVBAで実現する方法あるのでしょうか?

よろしくお願いします。

Aベストアンサー

No1 です。
今回の場合には
Docmd.RunCommand acCmdSaveRecord の方が良かったですね
文字通りレコードを保存します。
Requery に引きづられてしまいました (^_^;)

Recalc、Refresh、Requery の使い分けは下記が参考にはなりますか?
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QAccessでテーブルの値をテキストボックスに代入するには?

[ID][文字列]の2つのフィールドからなる単純なテーブルがあり、削除クエリを併用して常に最新のデータしか格納されていない状態に工夫できました。(データは常に1つ)
そこでフォーム上にあるテキストボックスにこのテーブルの[文字列]フィールドのデータを表示させたいのですが、
どうしたらよいでしょうか?

また、このテーブルの[文字列]フィールドのデータを直接変数として使いたい場合はVBAでどのように記述すればよいのでしょうか?

Aベストアンサー

テーブルに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名")」
IDごとに"データは常に1つ"ならコントロールソースに
「=DLOOKUP("文字列のフィールド名","テーブル名","[ID]='" & Me.ID & "'")」

Dlookup関数のヘルプ
http://office.microsoft.com/ja-jp/assistance/HP010496551041.aspx


人気Q&Aランキング