住所録を作成しています。
個人名,そのふりがな,会社名,電話番号,etc.と、ごく普通の住所録です。

過去の質問
http://www.okweb.ne.jp/kotaeru.php3?q=169901
を参考に、検索フォームを作成したのですが、
ボタン押下時ではなくテキスト入力時に検索結果が表示されるようにしたいと思い、下記のようにしてみました。

Private Sub TextBox_KeyPress(KeyAscii As Integer)

DoCmd.ApplyFilter , "(ふりがな like '" & Me.TextBox & "*')"

End Sub

単票形式で、フッターに検索テキスト入力用のTextBoxを配置しています。
このTextBoxに個人名のふりがなの一部を入力した時点で検索が行われるようにしたいのですが・・・。

上記コードで一応は検索できます。
たとえば「たな」と入力すれば、「たなか」さんや「たなべ」さんなどが表示され、レコード移動ボタンで移動できます。
しかし、「た」と入力して文字変換を確定すると、ふりがなが入力されているレコードを全て拾い、再度Enterを押すと「た・・」さんが表示されます。

この、再度Enterを押す動作をなくすには、どのようにすればいいのでしょうか?

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

A 回答 (2件)

うまく動作しなかったようですね


一応動作確認は、Access2000/97の両方とも行ったのですが、Access97ではおっしゃるとおりの動作になりました
すいませんm(_ _)m

下記のように変更して下さい
Private Sub TextBox_Change()

DoCmd.ApplyFilter , "(ふりがな Like '" & Me.[TextBox].Text & "*')"
Sendkeys ("{F2}")

Exit Sub

この"Sendkeys"コマンドは、キーボードから入力する同等の機能をもちます
(Access Helpを参照して下さい)
今回の場合は、検索処理が終了したらキーボードの「F2」キーを押下するという処理が追加しました

>Me以降を解説していただければありがたいのですが・・・。(^_^;)

" ~ Me.[TextBox].Text ~ " の ".text"のことでしょうか?
テキストボックス等のオブジェクトは、プロパティを省略すると、規定値である「.Value」が認識されます
「.Value」 -> 実際に確定された情報を取得できます
「.Text」 -> 現在表示されている状態を取得できます

オブジェクトにより、規定値はあらかじめ決まっています
規定値は何だったかなと思うよりは、日頃からすべてのプロパティを記入するように心がけています
(Accessの場合、ほとんどのオブジェクトのプロパティの規定値は「.Value」だったような...)
    • good
    • 0
この回答へのお礼

大変勉強になりました。
ありがとうございました。

お礼日時:2001/12/21 14:37

まず、キー入力時(KeyPress)のイベントをやめて、変更時(Change)のイベントにしてみましょう



そして、下記のように変更して下さい
Private Sub TextBox_Change()

DoCmd.ApplyFilter , "(ふりがな Like '" & Me![TextBox].Text & "*')"

Exit Sub

たぶん、希望するとおりに動作すると思いますが...
何か問題があったら、補足して下さい

この回答への補足

適切な回答ありがとうございました。
「!」でエラーになったので、「!」を削除したらきちんと動作しました。
Me以降を解説していただければありがたいのですが・・・。(^_^;)

欲を言えば・・・
「た」と入力すれば「た・・」さんが表示されますが、続けて「な」と入力しようとすると、「あn」となります。
これは、「た」が反転表示になっており、カーソルが「た」の前にある為だと思います。
「た」で確定した(検索した)後、つづけて「な」を入力して「たな」を検索キーワードにする方法はあるのでしょうか?

補足日時:2001/12/17 19:30
    • good
    • 0

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

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

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

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

QSQLでのワイルドカード使用について教えて下さい。

JSPのSQL構文でワイルドカードを使用したいのですが記述が分かりません。
教えて下さい。

String param = req.getParameter( "Str" );で値を拾って
("SELECT * FROM テーブル WHERE name='"+ param +"'")でこのparamの部分にワイルドカードを使用するにはどの様に書けば宜しいのでしょうか?

%'"+ param +"'%とか色々試してみました。

ご教示下さいませ。お願い致します。

Aベストアンサー

("SELECT * FROM Table where 氏名 like '%" + param + "%' order by 日付 desc");

で、たぶんいけると思います。
paramは変数なので文字列(ダブルクォーテーションで括っている中)の外に出す必要があります。

QEnterキー入力後の動作について

Enterキー入力後の動作についてお伺いします。よろしくお願いします。

特定のコントロールがフォーカスを取得したときにのみ、Enterキー入力後の動作を「移動しない」に変更したいのです。(ちなみに特定コントロール以外がコントロールを取得した場合は「次のフィールド」としたいです。)
もし特定コントロールフォーカス取得時が困難であれば、特定のmdbにのみEnterキー入力後の動作を「移動しない」を適用したいのです。

VBAはある程度理解しています。
解決方法をご教授ください。よろしくお願いします。

Aベストアンサー

特定のコントロールのキー関連イベントで。
Private Sub 特定のコントロール_KeyDown(KeyCode As Integer, Shift As Integer)
'キークリック時
  If KeyCode = 13 Then
    KeyCode = 0
  End If
End Sub

Private Sub 特定のコントロール_KeyPress(KeyAscii As Integer)
'キー入力時
  If KeyAscii = 13 Then
    KeyAscii = 0
  End If
End Sub

Private Sub 特定のコントロール_KeyUp(KeyCode As Integer, Shift As Integer)
'キー開放時
  If KeyCode = 13 Then
    KeyCode = 0
  End If
End Sub

Q【SQL】select に ワイルドカードを使う

SQLのSELECT文に
*(ワイルドカード)を使うのはあまりよろしくないと
http://oshiete.goo.ne.jp/qa/6276536.html
で掲載されています。

基本的に ”使う分だけ”
カラムを一個一個指定していくのが定石でしょうか。

使いたいカラムが増えたら、その都度SELECT文にも項目を
足していくのでしょうか。

よろしくお願いします。

Aベストアンサー

DBMSの持つ重要な要素の一つが、「データの独立性」です。
これは、DBの定義変更があっても、その変更部分を直接操作しないアプリは、変更する必要がないというものです。この意味は、DB操作だけでなく、直接ファイル操作するようなアプリを数多く開発した経験がある人なら、その重要性が分かるでしょう。

RDBMS登場以前の階層型DBMS、ネットワーク型DBMS、それらの国際標準規格準拠の構造型DBMSでは、DDLで吸収していました。
RDBMSでは、これをさらに「データ受け渡しする列を、事前に定義系SQLで定義せず、操作系SQLで決められる」という特長を持ちました。

RDBMSでの実装の上で問題になっているのが、「データ受け渡しする列数が多くなると、極端に性能劣化してしまう」ということです。

大規模システムではこのオーバヘッドは非常に影響が大きく、いくつかのRDBMSでは、この解決手段として、「固定長の列だけで表を構成した場合、性能向上を図れる」、あるいはこれとの組み合わせなどで、「表の定義順で全列を受け渡しする場合、列数が増えても一定の性能を出せる」といった性能対策を実装しているものもあります。

MySQLでも、固定長の列だけで表を構成した場合、性能向上を図れるといった性能対策を行っています。

これらのことから、「実際に操作する必要最小限の列だけを、明示的に指定する」といったことが推奨される大きな要因になっています。

DBMSの持つ重要な要素の一つが、「データの独立性」です。
これは、DBの定義変更があっても、その変更部分を直接操作しないアプリは、変更する必要がないというものです。この意味は、DB操作だけでなく、直接ファイル操作するようなアプリを数多く開発した経験がある人なら、その重要性が分かるでしょう。

RDBMS登場以前の階層型DBMS、ネットワーク型DBMS、それらの国際標準規格準拠の構造型DBMSでは、DDLで吸収していました。
RDBMSでは、これをさらに「データ受け渡しする列を、事前に定義系SQLで定義せず、操...続きを読む

Q検索し、集計をTextboxに

お世話になります。
   A    B
1 ビール  1300
2 焼酎    500
3 ジュース  300 
4 ウィスキー2000

A列のビールとウィスキーの値のみを
合計しUserFoamのTextboxに表示したいのですが
検索するには、Findを使うのでしょうか?
A列に重複データは、ありません。
アドバイスをお願いします。

Aベストアンサー

こんばんは。

それは、SUMIF でよいのでは?
エラーをはじき出すために、Application.SumIf にしてあります。
Excel 2007 なら、SumIf は、一つにつなげてしまってよいです。
実際は、Const N1, Const N2 は、TextBox などの代入値にしてもよいです。

Private Sub CommandButton1_Click()
  Dim r As Range
  Dim ret As Variant
  Const N1 As String = "ビール"
  Const N2 As String = "ウィスキー"
  
  Set r = Range("A1", Range("A65536").End(xlUp))
  ret = Application.SumIf(r, N1, r.Offset(, 1))
  ret = ret + Application.SumIf(r, N2, r.Offset(, 1))
  If Not IsError(ret) Then
    TextBox1.Value = ret
  End If
  Set r = Nothing
End Sub

こんばんは。

それは、SUMIF でよいのでは?
エラーをはじき出すために、Application.SumIf にしてあります。
Excel 2007 なら、SumIf は、一つにつなげてしまってよいです。
実際は、Const N1, Const N2 は、TextBox などの代入値にしてもよいです。

Private Sub CommandButton1_Click()
  Dim r As Range
  Dim ret As Variant
  Const N1 As String = "ビール"
  Const N2 As String = "ウィスキー"
  
  Set r = Range("A1", Range("A65536").End(xlUp))
  ret = Application.S...続きを読む

Qワイルドカードの特殊文字

ワイルドカードの特殊文字

ワイルドカードについて調べていますが、以下の事がわかりませんので、お教え頂けませんでしょうか?

質問1:
ワイルドカードは下記の2つ以外には特殊文字はないのでしょうか?
* 任意の長さの文字(0文字以上)
? 任意の1文字(0文字も可)

質問2:
ワイルドカードについて一般的に定められたガイドラインみたいなのはあるのでしょうか?

例えば、Wordでは、[ ]は、指定した文字のいずれか1文字を検索するみたいです。
http://office-qa.com/Word/wd211.htm

しかしながらコマンドプロンプトでは[]は使えないと思います。

ワイルドカードの仕様があり、アプリ毎に実装者が独自の拡張をおこなっているのでしょうか?

質問3:
ワイルドカードと正規表現の違いは厳密にいうとなんでしょうか?

Aベストアンサー

>> 質問1:

(SQL)
% 任意の長さの文字(0文字以上)
_ 任意の1文字(0文字も可)

>> 質問2:

決められた仕様はないと思います。
それぞれのソフトがそれぞれの文化の中で形成してきたものを使っていると思います。

>> 質問3:
>> ワイルドカードと正規表現の違いは厳密にいうとなんでしょうか?

文化ごとに仕様がバラバラなので厳密には言えないのですが、大きな物として制御の複雑さの違いがあります。
例えばワイルドカードは文字列と*?による部分的な一致しか扱えませんが、正規表現は更に細かく「数値ならば」「文字の範囲内(外)ならば」「行頭(行末)ならば」などの指定ができます。

Qaccess レコードソースを選択し、DoCmd.OpenFormする方法

Select Caseのフレームで、レコードソース(クエリ)を選択し、
そのソースを基にDoCmd.OpenFormする方法がわかりません。
よろしくお願いします。
----------------------------------------------------
Dim strSource As String
Dim Q1, Q2 As String
Dim stDocName As String
Dim フォーム1 As Form
stDocName = "フォーム1"
Q1 = "クエリ1"
Q2 = "クエリ2"

Select Case フレーム1
Case 1
strSource = Q1
Case 2
strSource = Q2
End Select

'stDocName.RecordSource = strSource '-----この文はこの位置でよいのでしょうか?
DoCmd.OpenForm stDocName, acFormDS
----------------------------------------------------
クエリ1,クエリ2は基になるテーブルが違いますが、フィールドは同一にしてあります。
ですのでフォーム1には、対応するテキストボックスは用意してあります。

Select Caseのフレームで、レコードソース(クエリ)を選択し、
そのソースを基にDoCmd.OpenFormする方法がわかりません。
よろしくお願いします。
----------------------------------------------------
Dim strSource As String
Dim Q1, Q2 As String
Dim stDocName As String
Dim フォーム1 As Form
stDocName = "フォーム1"
Q1 = "クエリ1"
Q2 = "クエリ2"

Select Case フレーム1
Case 1
strSource = Q1
Case 2
strSource = Q2
End Select

'stDocName.RecordSo...続きを読む

Aベストアンサー

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > 0 Then
    Me.RecordSource = Me.OpenArgs
  End If
End Sub

まあ、好き好きでしょうが<2>がOKのバージョンであれば<2>がお勧めです。

<補足>

ただ、WhereCondition を使うのが一般的かと思います。
全く異なるクエリであれば、それぞれに対応したフォームを用意した方がシンプルでは・・・。

<1>

Private Sub コマンド0_Click()
  DoCmd.OpenForm "フォーム1", acFormDS
  Forms("フォーム1").RecordSource = "クエリ" & Me.フレーム1
End Sub

<2>

Private Sub コマンド1_Click()
  DoCmd.OpenForm "フォーム1", acFormDS, , , , , "クエリ" & Me.フレーム1
End Sub

' ------------------------------------------
' [フォーム1] ロード時にレコードソース設定
' ------------------------------------------
Private Sub Form_Load()
  If Len(Me.OpenArgs & "") > ...続きを読む

QC言語 ワイルドカード

CUI環境でのワイルドカードのプログラムを考えています。
関数の再帰呼出しを使うと思うのですが、どのようなプログラムになるのでしょうか?もしくは、再帰呼び出しを使わずにワイルドカードを判別するプログラムが作れるのであれば、それはどのようになるのでしょうか?

Aベストアンサー

参考
http://www.google.co.jp/search?hl=ja&lr=lang_ja&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%20%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

MS-DOSのように狭義的な「*」と「?」のみならただのループで処理できる。
しかしCUIではシェルがワイルドカードを分解してから渡してしまうのでその辺りを考慮しなければならない

Q[Access VBA] DoCmd.OpenForm ...の書式について(VBAに詳しい方求む!)

仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。

そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をしました。

Private Sub 詳細記録_Click()
DoCmd.OpenForm 帳票名
End Sub

ボタンをクリックした時点で帳票名フィールドに記載されている
帳票の詳細記録フォームがたちあがります。
例えば帳票名フィールドが
「AA」の時→ボタンClick→AAの詳細記録フォームが立ちあがる。
「BB」の時→ボタンClick→BBの詳細記録フォームが立ちあがる。
(企業秘密のため具体的な帳票名を書けません。)

実はこのような動作をしてくれるのが目的だったのですが
疑問があるんです。
それより前には、上述のと1箇所だけ記述がいろいろ変えてました。

DoCmd.OpenForm "帳票名"

帳票名のところがダブルクォーテーションでくくってあるかないか
の違いです。
くくるとエラーが出ますが、くくらないとうまく行きます。

[帳票名]のときもうまく行きましたが、"[帳票名]" はだめのようです。

また、" "の中を具体的な帳票の名前にすると
(例:DoCmd.OpenForm "AA")
いつでもそのAAフォームだけがたちあがります。
(帳票名フィールドの記述がBBでも)

たまたまダブルクォーテーションをはずすと
うまく反応してくれたんでよかったんですが
ダブルクオーテーションひとつで
なぜこんなに動きが違うのか?
わかる方よろしくお願いします。

仕事でAccessを使用しています。
帳票管理のデータベースを作ってて
帳票名フィールドに各種の帳票の名前が格納されています。
ここはコンボボックスにしてあり、データベース化する
対象の帳票も決まってます。
メインのフォームには帳票の基礎データを入力し
フォーム上に作ったボタン(ボタン名「詳細記録」)を押すことで
各帳票の詳細な記録を書きこむフォームが現れるように設計する予定です。

そこで、メインのフォームに設けたボタンの
「クリック時」のイベントプロシージャに以下の記述をし...続きを読む

Aベストアンサー

文字列と要素名との使い分けで混乱なさってるようですね。

ダブルクォーテーションで括るのは、「ソースコード中に直接、文字列を記述する」場合のみです。

'テキストボックスに「こんにちは」と表示する
MsgBox "こんにちは"

この例では、MsgBox命令に対して、「こんにちは」という文字列を渡しています。

Dim Message as String
Message = "こんにちは"
MsgBox Message

この例では、Message という変数に「こんにちは」という文字列を代入し、MsgBox命令にMessage という変数を渡しています。
Messageは変数であって文字列ではないため、ダブルクォーテーションで括る必要がないのです。

DoCmd.OpenForm でも同様。

DoCmd.OpenForm "帳票A"
は、「帳票A」という文字列をDoCmd.OpenForm命令に渡しています。


帳票フィールドに「帳票A」という文字が格納されているとき、

DoCmd.OpenForm Me![帳票フィールド]

とすると、DoCmd.OpenFormに渡されるのは「Me![帳票フィールド]」という文字列ではなく、帳票フィールドに格納されている「帳票A」という文字列が渡されるのです。

尚、この命令文は

Dim Chouhyou As String
Chouhyou = Me![帳票フィールド]
DoCmd.OpenForm Chouhyou

とするのと同じです。

あんまりいい説明じゃないかもしれませんが、VBA理解の一助にでもなれば幸いです。

文字列と要素名との使い分けで混乱なさってるようですね。

ダブルクォーテーションで括るのは、「ソースコード中に直接、文字列を記述する」場合のみです。

'テキストボックスに「こんにちは」と表示する
MsgBox "こんにちは"

この例では、MsgBox命令に対して、「こんにちは」という文字列を渡しています。

Dim Message as String
Message = "こんにちは"
MsgBox Message

この例では、Message という変数に「こんにちは」という文字列を代入し、MsgBox命令にMessage という変数を渡しています...続きを読む

Qメタ文字とワイルドカードの比較

メタ文字とワイルドカードの比較して、
違いを調べているのですが、どうも明確によくわかりません。

両方とも「任意の文字列を指定するための特殊な文字」な事は
分かっているのですが、メタ文字はこの範囲、ワイルドカードは子の範囲など言葉の切り分けはあるのでしょうか?

Aベストアンサー

ワイルドカード文字とは、メタ文字の一種です。

メタ文字には、ワイルドカードな文字と、ワイルドカードじゃない文字があります。両方をひっくるめて「メタ文字」と言います。

・メタ文字
特殊な意味を持つ文字のこと。

「メタ」とは「超」と言う意味で「普通じゃない」と言うニュアンスです。つまり「特殊文字」って事です。

例えば、正規表現では
. ^ $ [ ] * + ? | ( ) \
が「メタ文字」です。

これらは「特殊である」と言うだけで、任意の文字や任意の文字列を意味するとは限りません。

たとえば「^」は、任意の文字を意味しません。意味するのは「行頭」です。

・ワイルドカード文字
メタ文字のうち、任意の文字、任意の文字列を表す特殊文字のこと。

例えば、正規表現では
. * + ?
が「ワイルドカード文字」です。

Q【ACCESS】ApplyFilterでデータ絞込みをした時、該当データがないと、条件の表示がおかしくなる

ACCESSの一覧表示しているフォームで、検索条件を設定させ、その検索条件よりApplyFilteを使って、データ絞込みをしています。
データがある場合はうまく動作するのですが、該当データがないと、その後、検索条件を変更しても、検索条件のコンボボックスに値が表示されなくなります。
でも、認識はしているようで、デバッグで見ると値が入っているし、再度検索して、該当データがある場合は、また検索条件のコンボボックスが表示されるようになります。

何かつくりが悪いのでこのように動作するのでしょうか?
もしくはデータが存在しない場合に何か別のことをするようにするなど、回避する方法があれば教えてください。

お願いします。

Aベストアンサー

状況が分からないので対症療法的ですが

If Dcount(Filter条件・・) = 0 Then
MsgBox "No Records!", vbOKOnly
Me.FilterOn = False
End If
とか?


人気Q&Aランキング