[[20110414200438]] 『あいまい検索の仕方がわかりません』(初心者) ページの最後に飛ぶ

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

 

『あいまい検索の仕方がわかりません』(初心者)

Excel2010 WindowsXP

コピペで入力したのですが、
検索方法が頭からの一致となっており
例えば3文字目からでも抽出できるようにしたいと
思っております。

KBanme = 0
および
KensakuChar = Mid(Namae, KBanme, 1)

で頭からの検索となっていることだけがわかりました…。

あいまい検索の方法をご教授いただければと
思います。

よろしくお願い致します。

以下原文

*****************************************************

Public Sub 検索(ByVal Namae As String, ByRef MeNamae As Object)

    Dim Nagasa As Integer
    Dim i As Long
    Dim MaxRows As Long
    Dim Touseki As Object
    Dim KensakuChar As String
    Dim ListNamae As String
    Dim ListChar As String
    Dim KBanme As Integer
    Dim LBanme As Integer

    Set Touseki = Worksheets("リスト")
    MaxRows = Touseki.UsedRange.Rows.Count
    Nagasa = Len(Namae)

    MeNamae.ListBox1.Clear

    For i = 3 To MaxRows
        ListNamae = Touseki.Cells(i, 3)
        KBanme = 0
        LBanme = 0
        Do
            Do While Nagasa >= KBanme
                KBanme = KBanme + 1
                KensakuChar = Mid(Namae, KBanme, 1)
                If KensakuChar <> " " Then
                    Exit Do
                End If
            Loop
            Do While Nagasa >= LBanme
                LBanme = LBanme + 1
                ListChar = Mid(ListNamae, LBanme, 1)
                If ListChar <> " " Then
                    Exit Do
                End If
            Loop

            If KensakuChar = ListChar Then
                If Nagasa = KBanme Then
                    With MeNamae
                        .ListBox1.AddItem (ListNamae)
                    End With
                End If
            Else
                Exit Do
            End If
        Loop Until Nagasa <= KBanme
    Next
End Sub


 よくわからないですが、Like演算子やFindメソッドで
 ワイルドカード(*や?)を使ってみてはどうでしょうか?
 (momo)

momo様

やはり上記のMidではいけないのですね…。

フォームを使って飛んでいるので、(これもコピー)
変えると分からなくなってしまうなぁと
上記の=を"'="にしたり"*"を入れたりしてみたのですが、
ダメな感じでした。。

実際今日からマクロ始めたので分からないことだらけでして…。

勉強しなおしてみます。

ご返信ありがとうございます。

(初心者)


 Mid関数で比較する方法でも出来ると思います。
 ただ、比較が冗長になって時間は掛かります
 InstrやLikeなら「含まれているか」という比較が出来ますし
 Findメソッドではセルを直接探します。
 また、もっと複雑な比較をするのなら正規表現という方法もあります。

 これらの InStr Like Find 正規表現 RegExp などという単語で
 色々検索してみるとヒントが多く見つかると思います。

 もしもう少し具体的な方法が必要であれば
 具体的にどのような状態のシートから、どんな曖昧検索をしたいのか
 という事を示して頂ければ参考程度のコードなら書きますけど
 (momo)

momo様

ありがとうございます。
病院リストを作成しております。

シート1(シート名:リスト)

      A       B     C       D以降情報

1 1(ハイパーリンク有) ◎◎法人 ■●△×病院

2 2(ハイパーリンク有) ◎◎法人 ◆▽病院

3 3(ハイパーリンク有) △△法人 □◎▼病院

 |

 500程度まで


同じブック内に1〜500程度の詳細を書けるシートを作成し、

それぞれの病院にリストからハイパーリンクで飛ぶようにしています。

検索はCを検索したく、上記マクロで

ListNamae = Touseki.Cells(i, 3)と

しました。

例えば1の△×と検索してもヒットするようにしたいのです。

今は■●と入れなければ1は出てきません。

フォームには

****************************************************

Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Initialize()

    Set Touseki = Worksheets("リスト")
    'Touseki.Activate
    Maxl = Touseki.UsedRange.Rows.Count
    'ListIdx = 0
    'ChangeSwitch = False

    'Call Member
    '透析条件テンプ作成
    'OptionButton1.Value = True
End Sub
Private Sub CommandButton1_Click()
    Dim Namae As String
    Dim MeNamae As Object

    Namae = TextBox1.Text
    Set MeNamae = KensakuForm
    Call 検索(Namae, MeNamae)

End Sub
Private Sub CommandButton2_Click()

    End
End Sub
Public Function Kensaku(ByVal Namae As String) As Integer
    Dim kensakuSu As Integer

    kensakuSu = 0
    For l = 1 To Maxl
        If Touseki.Cells(l, 3) = Namae Then
            kensakuSu = kensakuSu + 1
            If kensakuSu > 1 Then
                MsgBox ("リストの中に、同名で2件以上のデータがあります。不要なデータを削除して下さい。")
                Exit For
            End If
            Kensaku = l
        End If
    Next
End Function
Private Sub ListBox1_Click()
    'If ChangeSwitch = True Then
    '    保存忘れ防止装置
    'End If
    ListIdx = ListBox1.ListIndex
    Namae = ListBox1.List(ListIdx)
    l = Kensaku(ByVal Namae)

    'Call 個別へ表示(ByVal l)
    Touseki.Cells(l, 1).Activate
End Sub

*****************************************

と入っておりまして、
コマンドボックス2つとテキストボックス2つで

検索入力テキストボックス

         検索ボタン

結果表示テキストボックス

         閉ボタン

となっております。

昨日本屋に行ってしまったので、
返信が遅れました。

本屋で読んでもよく分からなかったんですけども…。

長文失礼いたしました。


 コードを見ると結果表示はTextboxではなくでListBoxではないですか?

 新規のユーザーフォームに

 TextBox1 (検索文字入力用)
 ListBox1 (結果表示用)
 CommandButton1 (検索実行用)
 CommandButton2 (フォーム閉じる)

 の4つのコントロールを配置してください。

 で、以下のコードを張り付けて試してみてください。

  Private Sub CommandButton1_Click()
    Dim tbl As Variant
    Dim i   As Long
    Dim buf As String
    Me.ListBox1.Clear
    buf = "*" & Me.TextBox1.Value & "*"
    If buf <> "**" Then
      tbl = Worksheets("リスト").Range("A1").CurrentRegion.Columns("C").Value
      With Me.ListBox1
        .ColumnCount = 2
        .ColumnWidths = .Width & ";0"
        For i = 1 To UBound(tbl)
          If tbl(i, 1) Like buf Then
            .AddItem tbl(i, 1)
            .List(.ListCount - 1, 1) = i
          End If
        Next i
      End With
    End If
  End Sub

  Private Sub CommandButton2_Click()
    Unload Me
  End Sub

  Private Sub ListBox1_Click()
    With Me.ListBox1
      Worksheets("リスト").Cells(.List(.ListIndex, 1), 1).Activate
    End With
  End Sub

 (momo)

できましたーーーーーーーー

ありがとうございます。

大変感謝感激です!

これで今日は寝れますw

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

構文の意味を勉強して
一人でできるようになりたいと思います。

(初心者)


コメント返信:

[ 一覧(最新更新順) ]


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