Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4936 / 13644 ツリー ←次へ | 前へ→

【53455】不完全一致の文字列検索 初心者@ 08/1/14(月) 3:08 質問[未読]
【53456】Re:不完全一致の文字列検索 じゅんじゅん 08/1/14(月) 9:32 発言[未読]
【53461】Re:不完全一致の文字列検索 初心者@ 08/1/15(火) 10:30 発言[未読]
【53465】Re:不完全一致の文字列検索 じゅんじゅん 08/1/15(火) 11:11 発言[未読]
【53470】Re:不完全一致の文字列検索 ichinose 08/1/15(火) 19:00 発言[未読]

【53455】不完全一致の文字列検索
質問  初心者@  - 08/1/14(月) 3:08 -

引用なし
パスワード
   こんばんわ。
早速、質問よろしいでしょうか?

セルA2〜A5(検索範囲)にそれぞれ文字列が入れてあり、TextBoxに入力した文字列(検索値)と照合してヒットした行の行番号を取り出したいのです。
そして、今回は検索値にワイルドカードなどを使用するなりして、検索範囲の中にある「不完全一致」の文字列でもヒットするようにしたいのです。

基本的に、このようなことは可能なのでしょうか?
単に、TextBox1への入力時間の削減がねらいです。

分かりにくい言葉で申し訳ないですが、分かる方教えていただけないでしょうか?

【53456】Re:不完全一致の文字列検索
発言  じゅんじゅん  - 08/1/14(月) 9:32 -

引用なし
パスワード
   ▼初心者@ さん:
>こんばんわ。
>早速、質問よろしいでしょうか?
>
>セルA2〜A5(検索範囲)にそれぞれ文字列が入れてあり、TextBoxに入力した文字列(検索値)と照合してヒットした行の行番号を取り出したいのです。
>そして、今回は検索値にワイルドカードなどを使用するなりして、検索範囲の中にある「不完全一致」の文字列でもヒットするようにしたいのです。
>
>基本的に、このようなことは可能なのでしょうか?
>単に、TextBox1への入力時間の削減がねらいです。
>
>分かりにくい言葉で申し訳ないですが、分かる方教えていただけないでしょうか?

>そして、今回は検索値にワイルドカードなどを使用するなりして、検索範囲の中にある「不完全一致」の文字列でもヒットするようにしたいのです。
とは、範囲内のデータ”全部”が該当するのですか?

例えば、”りんご”を検索するのに、”りんご”を入力するのではなく
”り”だけでも”りんご”を検索したいと言う事ではないですか?

【53461】Re:不完全一致の文字列検索
発言  初心者@  - 08/1/15(火) 10:30 -

引用なし
パスワード
   ▼じゅんじゅん さん:
>▼初心者@ さん:
>>こんばんわ。
>>早速、質問よろしいでしょうか?
>>
>>セルA2〜A5(検索範囲)にそれぞれ文字列が入れてあり、TextBoxに入力した文字列(検索値)と照合してヒットした行の行番号を取り出したいのです。
>>そして、今回は検索値にワイルドカードなどを使用するなりして、検索範囲の中にある「不完全一致」の文字列でもヒットするようにしたいのです。
>>
>>基本的に、このようなことは可能なのでしょうか?
>>単に、TextBox1への入力時間の削減がねらいです。
>>
>>分かりにくい言葉で申し訳ないですが、分かる方教えていただけないでしょうか?
>
>>そして、今回は検索値にワイルドカードなどを使用するなりして、検索範囲の中にある「不完全一致」の文字列でもヒットするようにしたいのです。
>とは、範囲内のデータ”全部”が該当するのですか?
>
>例えば、”りんご”を検索するのに、”りんご”を入力するのではなく
>”り”だけでも”りんご”を検索したいと言う事ではないですか?

返答遅れて申し訳ありません。

>>そして、今回は検索値にワイルドカードなどを使用するなりして、検索範囲の中にある「不完全一致」の文字列でもヒットするようにしたいのです。
>とは、範囲内のデータ”全部”が該当するのですか?

この質問はイエスです。

例えば、検索範囲には”りんご”,”りんごりら”,”りんごりらっぱ”の順番でインスタンスが入ってるとします。検索値には”り”を打ったとして、CommandButtonを押すごとに前述、”りんご”,”りんごりら”,”りんごりらっぱ”順番でActiveCellを移動してヒットするようにしたいんです。が、無理でしょうか?

【53465】Re:不完全一致の文字列検索
発言  じゅんじゅん  - 08/1/15(火) 11:11 -

引用なし
パスワード
   ▼初心者@ さん:
>▼じゅんじゅん さん:
>>▼初心者@ さん:
>例えば、検索範囲には”りんご”,”りんごりら”,”りんごりらっぱ”の順番でインスタンスが入ってるとします。検索値には”り”を打ったとして、CommandButtonを押すごとに前述、”りんご”,”りんごりら”,”りんごりらっぱ”順番でActiveCellを移動してヒットするようにしたいんです。が、無理でしょうか?

こちらの
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_find.html
FindNext メソッド
【例2】部分一致
が参考になると思いますが。
>Set c = .Find(What:=myKey, LookIn:=xlValues, lookat:=xlWhole, _
Set c = .Find(What:=myKey, LookIn:=xlValues, lookat:=xlPart, _
lookatの定数を変更して下さい。

> c.Interior.ColorIndex = 4 '明るい緑
c.Select で順番にActiveに出来ると思います。

*データ範囲及び検索値の与え方は、適宜修正の事。

>CommandButtonを押すごとに
ちょっと私には難しいかも。

【53470】Re:不完全一致の文字列検索
発言  ichinose  - 08/1/15(火) 19:00 -

引用なし
パスワード
   こんばんは。

>例えば、検索範囲には”りんご”,”りんごりら”,”りんごりらっぱ”の順番でインスタンスが入ってるとします。検索値には”り”を打ったとして、CommandButtonを押すごとに前述、”りんご”,”りんごりら”,”りんごりらっぱ”順番でActiveCellを移動してヒットするようにしたいんです。が、無理でしょうか?

テキストボックスやCommandButtonがどこに配置されたコントロールなのか
(ユーザーフォームなのか?シートなのか?)
明確に記述するようにしましょう!!

こういう記述をきっちりすることがプログラミングすることの「いろは」ですよ!!
(だって、仕様がはっきり、きっちりしてなければコードは書けませんから・・。)

ユーザーフォームで処理する例です。

新規ブックにて試してください。

ユーザーフォームを一つ作成してください(UserForm1)。
このユーザーフォームには、
   テキストボックス(TextBox1) 検索文字列入力用
   コマンドボタン (CommandButton1) 検索開始ボタン

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

標準モジュールに
'===========================================================
Option Explicit
'===========================================================
Sub main()
  mk_sample_data
  UserForm1.Show
End Sub
'===========================================================
Sub mk_sample_data()
  Range("a1:a7").Value = [{"りんご";"りんごりら";"りんごりらっぱ";"みかん";"みかん箱";"なす";"なす焼き"}]
End Sub


上記のUserform1のモジュールに
'===================================================================
Option Explicit
Private f_mode As Long '0検索中ではない 1検索中
'===============================================
Function get_findcell(Optional ByVal f_v As Variant = "", _
           Optional ByVal rng As Range = Nothing, _
           Optional ByVal alookin As XlFindLookIn = -4163, _
           Optional ByVal alookat As XlLookAt = 1, _
           Optional ByVal aso As XlSearchOrder = 1, _
           Optional ByVal asd As XlSearchDirection = 1, _
           Optional ByVal mc As Boolean = False, _
           Optional ByVal mb As Boolean = True) As Range
'指定された値でセル範囲を検索し、該当するセルを取得する
'input : f_v 検索する値
'    rng 検索する範囲
'    alookin 検索対象 xlvalues,xlformulas,xlcomments
'    alookat: :検索方法 1-完全一致 2-部分一致
'    aso : 検索順序 1 行 2 列
'    asd : 検索方向 1 Xlnext 2 XlPrevious
'    mc  : 大文字・小文字の区別 False しない True する
'    mb  : 半角と全角を区別   True する  False しない
'output:get_findcell 見つかったセル(見つからなかったときはNothingが返る)
  Static 検索範囲 As Range
  Static 最初に見つかったセル As Range
  Static 直前に見つかったセル As Range
  Static 検索方向 As XlSearchDirection
  If Not rng Is Nothing Then
    Set 検索範囲 = rng
    End If
  If f_v <> "" Then
    Set get_findcell = 検索範囲.Find(f_v, 検索範囲.Cells(検索範囲.Rows.Count, 検索範囲.Columns.Count), _
                    alookin, alookat, aso, asd, mc, mb)
    If Not get_findcell Is Nothing Then
     Set 最初に見つかったセル = get_findcell
     Set 直前に見つかったセル = get_findcell
     検索方向 = asd
     End If
  Else
    If 検索方向 = xlNext Then
     Set get_findcell = 検索範囲.FindNext(直前に見つかったセル)
    Else
     Set get_findcell = 検索範囲.FindPrevious(直前に見つかったセル)
     End If
    If get_findcell.Address = 最初に見つかったセル.Address Then
     Set get_findcell = Nothing
    Else
     Set 直前に見つかったセル = get_findcell
     End If
    End If
End Function
'=========================================================
Private Sub CommandButton1_Click()
  Dim rng As Range
  Dim ans As Range
  
  If f_mode = 0 Then
    If TextBox1.Text = "" Then Exit Sub
    Set rng = Range("a1", Cells(Rows.Count, "a").End(xlUp))
    Set ans = get_findcell(TextBox1.Text, rng, xlValues, xlPart, xlByRows, xlNext)
  Else
    Set ans = get_findcell()
    End If
  If Not ans Is Nothing Then
    ans.Select
    f_mode = 1
    CommandButton1.Caption = "次のデータ"
  Else
    MsgBox "検索終了"
    f_mode = 0
   
    CommandButton1.Caption = "検索開始"
   
    With TextBox1
     .Text = ""
     .SetFocus
     End With
    End If
End Sub
'=========================================================
Private Sub UserForm_Initialize()
  CommandButton1.Caption = "検索開始"
  TextBox1.IMEMode = fmIMEModeOn
  f_mode = 0
End Sub


として、適当なシートをアクティブにして
mainを実行してみてください。

アクティブシートのA列にサンプルデータが作成され、
ユーザーフォーム(UserForm1)が表示されます。

テキストボックスに
「り」と入力して、コマンドボタンをクリックしてください。

「り」がある最初の単語のセルを選択します。

再度、コマンドボタンをクリックしてください。

次の「り」がある単語のセルを選択します。

クリックすれば、単語がある限り選択を繰り返します。

全ての検索がおわるとその旨のメッセージ(検索終了)が表示されます。

サンプルコードとして、試してみてください。

4936 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free