Sub TEST6()
'文字列に「a」が含まれているか(大文字と小文字の区別なし)
If InStr(StrConv("ABC", vbUpperCase), StrConv("a", vbUpperCase)) > 0 Then
MsgBox "文字列に含まれています"
Else
MsgBox "文字列に含まれていません"
End If
End Sub
Sub TEST7()
'文字列に「A」が含まれているか(全角と半角の区別なし)
If InStr(StrConv("ABC", vbWide), StrConv("A", vbWide)) > 0 Then
MsgBox "文字列に含まれています"
Else
MsgBox "文字列に含まれていません"
End If
End Sub
実行してみます。
全角と半角を区別しないで検索できた
文字列を含みますとなって、全角と半角を区別しないで検索できました。
ひらがなとカタカナを区別しないで検索
ひらがなとカタカナを区別しないで、検索してみます。
検索対象の文字列と検索値を、「ひらがな」に統一して検索をします。
Sub TEST8()
'文字列に「あ」が含まれているか(ひらがなとカタカナの区別なし)
If InStr(StrConv("アイウ", vbHiragana), StrConv("あ", vbHiragana)) > 0 Then
MsgBox "文字列に含まれています"
Else
MsgBox "文字列に含まれていません"
End If
End Sub
Sub TEST9()
'文字種を区別しないで、検索する
If InStr(1, "アイウ", "あ", vbTextCompare) > 0 Then
MsgBox "文字列に含まれています"
Else
MsgBox "文字列に含まれていません"
End If
End Sub
実行してみます。
文字種を区別しないで検索できた
文字種を区別しないで、検索することができました。
検索した文字列の位置を使って文字列を操作
InStrを使って、
文字列の分割
特定文字列の間を切り出し
をやってみます。
氏名を分ける
氏と名を分けたい場合に「InStr」は使えます。
例えば「鈴木 一郎」を「鈴木」と「一郎」に分けたい場合です。
手順は次のようになります。
氏名を分ける手順
全角スペースの位置をInStrで探す
全角スペースの前を切り出す(氏)
全角スペースの後を切り出す(名)
というような流れになります。
Sub TEST10()
Dim A
'全角スペースの位置を取得
A = InStr(Cells(1, 1), " ")
'全角スペースの前を切り出し
Cells(1, 2) = Left(Cells(1, 1), A - 1)
'全角スペースの後を切り出し
Cells(1, 3) = Mid(Cells(1, 1), A + 1)
End Sub
全角スペースの位置を探すのが、InStrです。
全角スペースの前を切り出すのが、Leftです。
全角スペースの後を切り出すのが、Midです。
では実行してみます。
実行結果
「鈴木 一郎」を「鈴木」と「一郎」に分けることができました。
カッコ内の文字列を切り出し
カッコ内の文字列を切り出す場合にもInStrが使えます。
例えば、「123(456)789」のカッコ内の「456」を切り出したいといった場合です。
このような手順になります。
手順
"("の位置をInStrで探す
")"の位置をInStrで探す
カッコ内の文字列をMidで切り出す
というような流れになります。
文字列「123(456)789」からカッコ内の「456」を切り出してみます。
Sub TEST11()
Dim A
A = "123(456)789"
Dim B, C
B = InStr(A, "(") '「(」の位置を取得
C = InStr(A, ")") '「)」の位置を取得'カッコの中を切り出し
MsgBox Mid(A, B + 1, C - B - 1)
End Sub
では実行してみます。
実行結果
結果は「456」となりました。
文字列「123(456)789」のカッコ内の文字列を取得することができました。
指定した文字列を含む値を抽出する
指定した文字列を含む値を抽出する、というのをやってみます。
InStrを使って値を抽出するのは、実務ではかなり使いますので、マスターしていきましょう。
InStrで検索して抽出する
InStrで文字列を検索して、値を抽出してみます。
セルをFor~Nextでループして、指定した値を含む値をInStrで抽出していきます。
Sub TEST12()
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
'検索値を含む文字列を探す
If InStr(Cells(i, "A"), Range("C2")) > 0 Then
'セルに転記
Cells(Rows.Count, "C").End(xlUp).Offset(1, 0) = Cells(i, "A")
End If
Next
End Sub
表の中から「鈴木」を含む文字列を抽出してみます。
「鈴木」を抽出してみる
実行すると、「鈴木」を含む文字列を抽出できます。
「鈴木」を抽出できた
実行すると、「鈴木」を含む文字列を抽出できました。
重複を削除するとリストを作成できる
ちなみに、重複がある表示で実行すると、抽出した値が重複してしまいます。
重複した値がある場合
先ほどのVBAコードを実行してみます。
抽出したデータに重複がでてきます。
抽出した値が重複しないようにしたい場合は、重複の削除が使えます。
ユニークな値のみを検索する
ユニークな値のみを検索するVBAコードになります。
値を抽出して、最後に重複データを削除します。
Sub TEST13()
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
'検索値を含む文字列を探す
If InStr(Cells(i, "A"), Range("C2")) > 0 Then
'セルに転記
Cells(Rows.Count, "C").End(xlUp).Offset(1, 0) = Cells(i, "A")
End If
Next
Dim LastRow
LastRow = Cells(Rows.Count, "C").End(xlUp).Row '最終行を取得'重複を削除
Range("C5:C" & LastRow).RemoveDuplicates Columns:=1, Header:=xlNo
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
'E2以外の変更は終了
If Target.Address(False, False) <> "E2" Then Exit Sub
'データを初期化
Range("E5:E10").ClearContents
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
'検索値を含む文字列を探す
If InStr(Cells(i, "A"), Range("E2")) > 0 Then
'セルに入力
Cells(Rows.Count, "E").End(xlUp).Offset(1, 0) = Cells(i, "A")
End If
Next
Dim LastRow
LastRow = Cells(Rows.Count, "E").End(xlUp).Row '最終行を取得'重複を削除
Range("E5:E" & LastRow).RemoveDuplicates Columns:=1, Header:=xlNo
End Sub