住所録を作成しています。
個人名,そのふりがな,会社名,電話番号,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と関連する良く見られている質問

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検索し、集計を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...続きを読む

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

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【ACCESS】ApplyFilterでデータ絞込みをした時、該当データがないと、条件の表示がおかしくなる

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

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

お願いします。

Aベストアンサー

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

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


人気Q&Aランキング

おすすめ情報