- ベストアンサー
【Excel2003】VBAを使って指定した文字を検索する方法
- Excel2003を使ってVBAを利用して指定した文字を検索する方法について解説します。
- 具体的な処理として、「あるセル」から見て最も近い、A列の「ある特定の文字が入っているセル」を検索しコピーし、別シートに貼り付ける方法を説明します。A列には複数の特定の文字が存在し、あるセルから最も近いセルを見つける方法を紹介します。
- 例えば、「あるセル」をJ30とし、A列に存在する「時間」という文字を検索する場合の手順を詳しく説明します。J30から最も近いセルにある「時間」を検索し、それを別のシートのA1に貼り付ける方法です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 Find メソッドの SearchDirection を xlNext, xlPrevious でそれぞれ 検索する方法でもできますよ。 Sub SampleProc() Dim r1 As Range Dim r2 As Range Dim vKeyword As Variant Dim n As Long ' // 検索文字の問い合わせ vKeyword = Application.InputBox("ワイルドカードが使えます", _ Title:="検索キーワード", _ Type:=2) If VarType(vKeyword) = vbBoolean Then Exit Sub End If ' // 前方と後方にそれぞれ検索 Set r1 = Columns("A").Find(What:=vKeyword, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchDirection:=xlNext) Set r2 = Columns("A").Find(What:=vKeyword, _ SearchDirection:=xlPrevious) ' // アクティブセルより行番号が近い方をコピーする If r1 Is Nothing And r2 Is Nothing Then MsgBox "Not found.", vbInformation Else n = ActiveCell.Row Set r1 = IIf(Abs(n - r1.Row) <= Abs(n - r2.Row), r1, r2) r1.Copy Destination:=Worksheets("Sheet2").Range("A1") End If End Sub > VBAを使って文字を検索したいと思います。 仕様の提示のみで、質問点が書かれていない気がしますが...
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
(1)Findを用いる。 たまたま質問の内容から、FindNextは不要でわかりやすいとおもう。下記方法では、第2の発見を求める必要が無い。 (2)この小生の思い付いたロジックの特徴は 中心(質問のJ20の場合はA列の第20行。下記コードではc)から上下プラスマイナスi 行の範囲を検索し、見つからなければ、次は上下とも各1行を増やして検索する。これを順次、限度まで繰り返す。初めて見つかった行が、中心から一番近い検索語所在の行であるといえる(<-ここがポイント)。限度はA列第1行と、データ最下行である。 ーーーーー Sub test01() Dim x As Range Dim st As Integer Dim ed As Integer d = Range("A65536").End(xlUp).Row 'A列データ最下行を求む s = Range("B1") '探索語あるセル 例 時間 t = Range("C1") '中心セル 例J20 c = Worksheets("Sheet1").Range(t).Row '中心セルの行番号を求む 'MsgBox c For i = 1 To 20 '---A列探索最上セル行番号stを求める If c - i > 0 Then st = c - i Else st = 1 End If '---A列探索範囲最下セル行番号edを求める If d > c + i Then ed = c + i Else ed = d End If '-----A列探索範囲指定。st上限セル、edは下限セル行番号 Range(Cells(st, "A"), Cells(ed, "A")).Select '--A列行番号st-edの範囲で検索語sを検索 Set x = Selection.Find(What:=s, After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False) If x Is Nothing Then '検索語見つからずー>範囲を上下1行増やして検索 If st = 1 And ed = d Then '上限が第1行、下限がA列データ最下行に達しても '検索語が見つからず MsgBox "見つからず" Exit Sub '処理終了 Else GoTo p1 '範囲を上下1行広げて探索繰り返し End If Else r = x.Row '見つかった行を求める MsgBox r Exit Sub '目的達成終了 End If p1: Next i End Sub
- hana-hana3
- ベストアンサー率31% (4940/15541)
こんな感じでしょうか? 一番近い位置を同じ行として、一行上、一行下、二行上、二行下・・・と探していきます。 Sub test1() Dim R As Long Dim Ofs As Long Dim i As Long Dim Pos As Long Dim word As String R = ActiveCell.Row 'どこかのセル word = InputBox("文字は?", "検索文字") Pos = 0 If InStr(Cells(R, 1), word) > 0 Then Pos = R Else For i = 1 To 65536 If R - i > 0 Then If InStr(Cells(R - i, 1), word) > 0 Then Pos = R - i Exit For End If ElseIf R + i <= 65536 Then If InStr(Cells(R + i, 1), word) > 0 Then Pos = R + i Exit For End If End If Next End If If Pos <> 0 Then Cells(Pos, 1).Copy Sheets("別シート").Range("A1") End If End Sub