|
こんばんは。
>例えば、検索範囲には”りんご”,”りんごりら”,”りんごりらっぱ”の順番でインスタンスが入ってるとします。検索値には”り”を打ったとして、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)が表示されます。
テキストボックスに
「り」と入力して、コマンドボタンをクリックしてください。
「り」がある最初の単語のセルを選択します。
再度、コマンドボタンをクリックしてください。
次の「り」がある単語のセルを選択します。
クリックすれば、単語がある限り選択を繰り返します。
全ての検索がおわるとその旨のメッセージ(検索終了)が表示されます。
サンプルコードとして、試してみてください。
|
|