次のようなUserFormで表示してみましょう。

リストボックスを選択すると、ワークシート上で該当するセルにアクティブセルを移動します。

すべてを検索するところは、前ページの「見つかったセルを別のシートにコピーする」と同じです。別のシートにコピーする代わりに、UserFormのリストボックスに、セルのアドレスと値を登録します。そして、すべての検索が終了したら、UserFormを表示してやります。
Sub Sample8()
Dim FoundCell As Range, FirstCell As Range
Set FoundCell = Cells.Find(What:="田中")
If FoundCell Is Nothing Then
MsgBox "見つかりません"
Exit Sub
Else
Set FirstCell = FoundCell
リストボックスにアドレスと値を登録
End If
Do
Set FoundCell = Cells.FindNext(FoundCell)
If FoundCell.Address = FirstCell.Address Then
Exit Do
Else
リストボックスにアドレスと値を登録
End If
Loop
UserFormを表示
End Sub
リストボックスに登録するのは、検索で見つかったセルのアドレスと、そのセルに入力されている値です。それぞれ「FoundCell.Address」と「FoundCell.Value」で取得できます。
リストボックスにデータを登録するには
ListBox1.AddItem 登録したいデータ
とします。アドレスと値がくっついては見にくいので、間にタブ(vbTab)を入れましょうか。
ListBox1.AddItem FoundCell.Address & vbTab & FoundCell.Value
となります。
Sub Sample8()
Dim FoundCell As Range, FirstCell As Range
Set FoundCell = Cells.Find(What:="田中")
If FoundCell Is Nothing Then
MsgBox "見つかりません"
Exit Sub
Else
Set FirstCell = FoundCell
UserForm1.ListBox1.AddItem FoundCell.Address & vbTab & FoundCell.Value
End If
Do
Set FoundCell = Cells.FindNext(FoundCell)
If FoundCell.Address = FirstCell.Address Then
Exit Do
Else
UserForm1.ListBox1.AddItem FoundCell.Address & vbTab & FoundCell.Value
End If
Loop
UserFormを表示
End Sub
UserFormを表示するのはShowメソッドですが、ここはひとつ[検索と置換]ダイアログボックスのように、UserFormを表示している間も、ワークシートを操作できるようにしましょう。それには、UserFormをモードレスで表示します。UserFormをモードレスで表示するには、Showメソッドの引数に、定数vbModelessを指定します。
Sub Sample8()
Dim FoundCell As Range, FirstCell As Range
Set FoundCell = Cells.Find(What:="田中")
If FoundCell Is Nothing Then
MsgBox "見つかりません"
Exit Sub
Else
Set FirstCell = FoundCell
UserForm1.ListBox1.AddItem FoundCell.Address & vbTab & FoundCell.Value
End If
Do
Set FoundCell = Cells.FindNext(FoundCell)
If FoundCell.Address = FirstCell.Address Then
Exit Do
Else
UserForm1.ListBox1.AddItem FoundCell.Address & vbTab & FoundCell.Value
End If
Loop
UserForm1.Show vbModeless
End Sub
これで、標準モジュール側のマクロは完成です。あとは、UserForm側のマクロですね。
まず、簡単なところで[閉じる]ボタンからいきましょうか。[閉じる]ボタンをダブルクリックして、次のプロシージャを記述します。
Private Sub CommandButton1_Click()
Unload Me
End Sub
次に、リストボックスでデータを選択したとき、そのセルにアクティブセルを移動する処理です。リストボックスをダブルクリックすると、次のプロシージャが挿入されます。
Private Sub ListBox1_Click() End Sub
このListBox1_Clickプロシージャは、リストボックスのデータがクリックされたときに発生します。また、マウスのクリックだけでなく、矢印キーなどでデータを選択しても発生します。
さて、リストボックスで選択されているデータはValueプロパティで取得できます。
ListBox1.Value
ここには「セルのアドレス<Tabコード>セルの値」という形式で登録しました。アクティブセルを移動するのに必要なのは、Tabコードの左側にある「セルのアドレス」ですから、これを抜き出さなければなりません。こんなときに便利なのがSplit関数です。
Split関数は、文字列を指定した文字で区切り、分割されたそれぞれのデータを配列形式で返す関数です。CSVファイルのデータをカンマで区切るのをイメージしてください。たとえば「tanaka,suzuki,yamada」という文字列が変数bufに格納されていたとします。Split関数を使って、この変数bufをカンマで区切るには、次のようにします。
Split(buf, ",")
結果は、次のような配列形式になります。
(0) tanaka (1) suzuki (2) yamada
今回は、ListBox1.Valueで取得できる「アドレス Tabコード 値」を「Tabコード」で分割します。Split関数が返す配列の(0)が左側のアドレスになります。
Split(ListBox1.Value, vbTab)(0)
結果はアドレスですから、これを変数に格納して、Rangeに使いましょう。
Private Sub ListBox1_Click()
Dim Target As String
Target = Split(ListBox1.Value, vbTab)(0)
Range(Target).Select
End Sub