- ベストアンサー
EXCEL 検索
EXCEL 検索する欄を作りたいと思っています。 つまり、オートフィルタをVBAにしたいのですが、 その検索する文字は、まちまちなのです。 普通にインターネットで検索を行うような感じで検索できたらと考えているのですが。 調べていますが、ぴったりあてはまるものがありません。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
少し解説をつけておきます。 詳しい動作はヘルプで調べてください。 --- Sub mSearch() Dim strS As String Dim c As Object Dim f As Long Dim i As Long Dim r As Long Dim a As String On Error Resume Next strS = InputBox("検索文字を入力") If strS = "" Then Exit Sub '入力がない場合終了 Application.ScreenUpdating = False '画面更新を停止 Worksheets(1).Select Cells.ClearContents '先頭シートを検索結果表示用に利用しているのでシートをクリア r = 1 '検索結果を設定する開始行 For i = 2 To Sheets.Count 'シート2番目から最後までを順次検索 With Worksheets(i).Range("A1:IV65536") 'すべてのセルを対象 Set c = .Find(strS, LookIn:=xlValues) 'Inputで指定した文字(strS)を検索 If Not c Is Nothing Then '検索が存在した場合 firstAddress = c.Address '検索アドレスを退避(検索終了判定に使用) Do '検索繰り返しを開始 a = "'" & Worksheets(i).Name & "'!" & c.Address Worksheets(1).Hyperlinks.Add _ Anchor:=Worksheets(1).Cells(r, 1), _ Address:="", _ SubAddress:=a, _ TextToDisplay:=Worksheets(i).Name & ":" & c.Value 'シート名+検索文字を含む文字列をセル(r,1)に設定し、その文字列にハイパーリンクを設定 r = r + 1 Set c = .FindNext(c) '次を検索 Loop While Not c Is Nothing And c.Address <> firstAddress '検索が存在する間かつ最初のアドレスでない間繰り返す。 End If End With Next i Application.ScreenUpdating = True '画面更新を再開 Worksheets(1).Cells(1, 1).Select End Sub
その他の回答 (3)
- o_chi_chi
- ベストアンサー率45% (131/287)
#2です。 For i = 2 To Sheets.Count ここを変更すればいいです。 iをループのなかで使用しているので For~Nextをやめて i = 2 と固定すれば2シート目だけ検索できます。 またForのあとにIf文でシート名を判定して検索しないものをとばすとか。 いろいろ試してください。
- o_chi_chi
- ベストアンサー率45% (131/287)
こんなのはどうですか。 ※先頭シートは検索用 Sub mSearch() Dim strS As String Dim c As Object Dim f As Long Dim i As Long Dim r As Long Dim a As String On Error Resume Next strS = InputBox("検索文字を入力") If strS = "" Then Exit Sub Application.ScreenUpdating = False Worksheets(1).Select Cells.ClearContents r = 1 For i = 2 To Sheets.Count With Worksheets(i).Range("A1:IV65536") Set c = .Find(strS, LookIn:=xlValues) If Not c Is Nothing Then firstAddress = c.Address Do a = "'" & Worksheets(i).Name & "'!" & c.Address Worksheets(1).Hyperlinks.Add _ Anchor:=Worksheets(1).Cells(r, 1), _ Address:="", _ SubAddress:=a, _ TextToDisplay:=Worksheets(i).Name & ":" & c.Value r = r + 1 Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> firstAddress End If End With Next i Application.ScreenUpdating = True Worksheets(1).Cells(1, 1).Select End Sub
補足
もう少し教えていただきたいのですが、 このコードだとすべて検索しますよね。 シートの指定はできるのでしょうか。
- web2525
- ベストアンサー率42% (1219/2850)
一例: オートフィルターの動作をマクロの記録で記録してみましょう Range("$A$1:$A$22").AutoFilter Field:=1, Criteria1:="a" ※$A$1:$A$22セル範囲を【a】でフィルター掛けた結果(余分な部分は省いています) Criteria1:="a"の部分を Criteria1:=Range("B1")と変更してマクロを実行するとB1セルの内容でフィルターを掛ける形になります。
補足
ありがとうございます。 ただ、まだわからないことが。 このコードは、完全一致の場合は出てきますが、部分一致「~を含む」という形でしたいのです。 *のつけかたがわかりません。 おわかりになられるようなら教えてください。
お礼
ありがとうございます。 記入していただいたコードの内容をあまり理解できていませんでした。 どういうことが書かれているのか、しっかり理解して使いたいと思います。