Excel VBA質問箱 IV

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

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


28563 / 76738 ←次へ | 前へ→

【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)が表示されます。

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

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

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

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

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

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

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

【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 発言

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