[[20170324193111]] 『TextBoxからセル値検索時に、空白除去した状態で戟x(ちゃんぷる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『TextBoxからセル値検索時に、空白除去した状態で検索したい。』(ちゃんぷる)

お世話になっております。
皆さま何卒アドバイスの程よろしくお願いしますm(_ _)m

現在

TextBoxに入力した値が、L列にあるかを検索し一致したら

1.一致した行全体選択
2.TextBox1にB列セル値を読み込み
3.その他

の処理をしております。

※TextBoxには、「半角カナ」で名前を入力し曖昧検索させています。

※検索先のL列には半角カナで名前が入力してあり
 「姓と名」の間には「半角空白」を入れております。

(質問ですが・・・)

検索値をTextBoxに入力する際に空白を除いて姓名を入力し検索できればと考えております。

(理由ですが・・・)

下記の同じ名字がL列にありその中から「サトウ マイ」を検索したい場合

サトウ アイ
サトウ リン
サトウ マイ

TextBoxに・・・

サトウ と入力→結果:× 先頭にある「サトウ アイ」がヒット

サトウマイ と入力→結果:× 不一致

サトウ マイ と入力→結果:○ヒット

「結局、空白スペースを含めた名前を全部入力しなければならず面倒どうせフルネーム入力するのであれば、空白は省きたい」

というのが理由です。

(現在のコード)

'【カナ検索】 ※TextBox2は自動で半角入力にしてある

Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    Dim x As Variant '検索値
    Dim y As Long '検索結果セル行

    '検索用テキストボックスの中に文字の入力があるかどうかをチェック。
    If Not TextBox2.Value = Empty Then

        'B列の中に検索するIDがあるかどうかをチェックします。
        Set x = Columns("L:L").Find(TextBox2, LookIn:=xlValues, LookAt:=xlPart) '曖昧

        '検索結果が発見できれば=エラー処理
        If Not x Is Nothing Then

            y = x.Row 'ヒット列セルの行数を格納

            TextBox1.Value = Range("B" & y).Value 'TextBox1にID値を転記する

            x.EntireRow.Select '行全体を選択。

            Call セルの値を連絡一覧に読み込む '各TextBoxに情報を読み込む

        Else '検索結果が発見できなければ

            MsgBox "検索した名前(カナ)は登録されていません。"

            TextBox2.Value = Empty

        End If

    Else 'TextBoxが空欄の場合以下

        MsgBox "検索する名前(カナ)を入力して下さい。"

    End If

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 TextBoxにいれられた サトウマイ で L列の サトウ マイ を 検索しようとすれば、当たり前ですが
 サトウマイ を サトウ マイ に変換してからマッチングを行うことになりますね。

 でも、これは不可能です。

 サトウマイ は、もしかしたら サト ウマイ さんかもしれません。 あるいは サトウマ イ さんかもしれません。
 連続した サトウマイ を 姓と名前に分けることは理屈として不可能ですね。

 やるなら、L列 の名前から半角スペースを取り除いた文字列を、どこか別の列に作っておき
 その列に対して検索を行うということが必要でしょうね。

 もちろん、この方法の応用系として、そういった(スペースを取り除いた)リストをメモリー内で作り上げ
 そこを検索するということもできるでしょうね。

 ただ もし、本当に サトウ マイ も サト ウマイ も サトウマ イ も存在するなら、その中の最初のものがヒットしますけど。

(β) 2017/03/24(金) 20:10


 追伸です。

 私がこれをやるなら、TextBox入力ではなく ComboBox に L列の名前を入れておいて、それを選択させますね。

 さらに追伸

 トピのテーマではありませんが、そもそも、本件処理を、フォーカスが通り過ぎるだけで発生する
 Exitイベントで処理する意図は何ですか??

(β) 2017/03/24(金) 20:12


βさん

ありがとうございました。

Exitイベントですが、入力+エンターで検索する方法をネットで調べたらありましたので
参考にさせてもらいました。

件数は200件程ありますので、ComboBoxの有効活用は頭に浮かびませんでした。
とりあえず下記の対応でなんとかなりました。


配列内に読み込んで、空白削除して検索して・・・は私の頭がついていかないようでしたので・・・

TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

に対し

Cancel = True

で、TextBox2にフォーカスをおいておき

正しい検索結果がでるまで・・・

入力→検索→文字修正→検索→文字修正→ヒット!!

というやり方で対応したいと思います。

(ちゃんぷる) 2017/03/24(金) 20:50


 もう、ご覧にならないかもしれませんが。

 Sub 参考()
    Dim v As Variant
    Dim z As Variant

    v = Application.Substitute(Range("L1", Range("L" & Rows.Count).End(xlUp)), " ", "")
    z = Application.Match("サトウマイ", v, 0)

    If IsNumeric(z) Then
        MsgBox z & "行目"
    Else
        MsgBox "ありません"
    End If

 End Sub

 それと

 >Exitイベントですが、入力+エンターで検索する方法をネットで調べたらありましたので 

 いえいえ。違います。(もし、そういうことが書いてあったとすれば、そのサイトが間違っています)

 入力+エンターで発生するのは BeforeUpdate または AfterUpdate です。
 Cancel処理が必要なら Exit ではなく BeforeUpdate を使ってください。

(β) 2017/03/24(金) 21:02


βさん

アドバイスありがとうございます。

先程解決したと申しましたが大問題発生!!

TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

Cancel = True

の部分に大きな落とし穴がありました。

TextBox2から他にフォーカスを移せない!!!!(^_^;)

なので、下記の KeyDown・・・に変更してうまく動くようになりました(^^)

Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    Dim x As Variant    '検索値
    Dim y As Long    '検索結果セル行
    If KeyCode = vbKeyReturn Then
        Me.TextBox2.Visible = False
        Me.TextBox2.Visible = True
        '検索用テキストボックスの中に文字の入力があるかどうかをチェック。
        If Not TextBox2.Value = Empty Then
            'B列の中に検索するIDがあるかどうかをチェックします。
            Set x = Columns("L:L").Find(TextBox2, LookIn:=xlValues, LookAt:=xlPart)    '曖昧
            '検索結果が発見できれば=エラー処理
            If Not x Is Nothing Then
                y = x.Row    'ヒット列セルの行数を格納
                TextBox1.Value = Range("B" & y).Value    'TextBox1にID値を転記する
                x.EntireRow.Select    '行全体を選択。
                Call セルの値を連絡一覧に読み込む    '各TextBoxに情報を読み込む
            Else    '検索結果が発見できなければ
                MsgBox "検索した名前(カナ)は登録されていません。"
                TextBox2.Value = Empty
            End If
        Else    'TextBoxが空欄の場合以下
            MsgBox "検索する名前(カナ)を入力して下さい。"
        End If
        Me.TextBox2.SetFocus    'カーソルは文字の末部分に
        'Me.TextBox2.SelStart = 0 ' <-- カーソル先頭時(使わない)
        KeyCode = 0 'Returnコードを無効にしてフォーカスをそのままにする
    End If
End Sub
(ちゃんぷる) 2017/03/24(金) 21:30

 う〜・・・・・・ん・・・・

 なぜ BeforeUpdateを使わないんですか?

 アップされた KeyDown コードですけど エンターしかチェックしてませんよね?
 入力後、フォーカスが、他のコントロールに移動する(つまり、入力が終わった)トリガーは
 エンターだけではないですね。

 タブ でも シフト/タブ でも さらには、マウスで別コントロールを選択しても 入力は完了します。
 でも、エンターじゃないので、チェックされないですねぇ?

 それと・・・・・

 あいまい検索なんですか??

 そうすると サトウ といれてエンターすると サトウ アイ がヒット。
 これは、具合が悪いと、最初におっしゃっていませんでしたっけ??

(β) 2017/03/24(金) 21:40


コンボボックス案に1票

検索機能も付いてますよね?コンボボックス(使い勝手はどうかわかんないですけど、、、)

あと、
BeforeUpdate案にも1票

他人に相談するなら、
一人で突っ走らないで、他人の話もちゃんと聞きましょう^^;

(まっつわん) 2017/03/24(金) 21:50


まっつわん さん

≫Cancel処理が必要なら Exit ではなく BeforeUpdate

の部分ですが、フォーカスがどうしてもTextBoxに固定されてしまい
他の処理ができず使用を断念しました。(解除方法があるとは思いますが)

もともと、検索エンジンのオートコンプリト機能のような感じを
目指していたので・・・

βさんのアドバイスを元に一から考えてみました。

ご指摘にもあったコンボボックスを使用する方向で検討しました。

ComboBoxにはオートコンプリート機能っぽいものはあるのですが、標準機能では1字のみなので

セルから、検索文字を1文字目・2文字目・3文字目・・・と

絞り込むような感じで抽出するようにComboBoxのChangeイベントで入力毎に

リストを読み込むように作成中です。

(ちゃんぷる) 2017/03/26(日) 04:16


 >もともと、検索エンジンのオートコンプリト機能のような感じを 目指していたので・・・ 

 なるほど。

 であれば、最初から、質問テーマとして、そちらを挙げられたらよかったと思いますね。
 質問文からは 実際のデータは 姓と名前の間に空白あり、入力は連続。これをマッチさせたいということしか
 伝わらなかったです。

 要件は、まったくことなりますが、過去に、そういったテーマで、いくつかお手伝いしたことがあります。
 TextBoxとListBoxを組み合わせた方法で、トピによっては フィルターオプションを使ったものもありますが
 ちょっと力技の以下のようなものもありました。

 参考にならないかもしれませんが。

[[20150517160757]] 『Excelでサイジェスト』(たか)

(β) 2017/03/26(日) 05:40


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.