InStrを使えば、特定の文字が何番目にあるかを調べることができます。
これとif文を組み合わせると、特定の文字を含むときだけ処理を実行することができます。
特定の文字が含まれるか判別する方法
InStr
Sub test()
Target = "123456789"
pos = InStr(Target, "5")
MsgBox pos
End Sub
上記コードでは、文字列”123456789″の左から何番目に“5”があるかを調べています。
5番目にあるので、実行すると数字の5が表示されるはずです。
Sub test()
Target = "hello world"
pos = InStr(Target, "world")
MsgBox pos
End Sub
このコードでは、”hello world”の中で”world”が左から何番目かを確認しています。
“hello”と半角スペースで6文字なので、7文字目からが”world”ですね。
検索文字が複数ある場合
検索文字が複数含まれる場合は先に見つかった位置を返します。
Sub test()
Target = "hello world"
pos = InStr(Target, "l")
MsgBox pos
End Sub
この場合、”l”は”hello”にも”world”にも含まれますが、実行すると3だけが表示されます。
最初に”l”が含まれているのが”hello”の3文字目だからです。
検索文字を含まない場合
検索文字が含まれない場合は0になります。
Sub test()
Target = "hello world"
pos = InStr(Target, "good")
MsgBox pos
End Sub
“good”は含まれていないので、実行してみると0が表示されるはずです。
InStrで特定の文字を含むか判別する方法
検索文字が含まれない場合は0、含まれる場合は1以上が出力されるので、条件分岐ができます。
Sub test()
Target = "hello world"
If InStr(Target, "good") > 0 Then
MsgBox "goodが含まれます"
Else
MsgBox "goodは含まれません"
End If
End Sub
“good”が含まれないので、条件であるInStr() > 0を満たしません。
なのでElseの方の処理が実行されます。
誤字を入れた場合
InStrは誤字を入力しても0を返します。
Sub test()
Target = "hello world"
pos = InStr(Target, "word")
MsgBox pos
End Sub
上記コードでは、”world”ではなく”word”にしました。
“wor”まで同じなので7が表示されるかと思いますが、実際は0です。
InStrRev
以下のように、”hello”が2回出てくる文字列があるとします。
Sub test()
Target = "hello world hello"
pos = InStr(Target, "hello")
MsgBox pos
End Sub
InStrは左から検索するので、実行すると1が表示されます。
ここで左の”hello”ではなく右の”hello”の位置を知りたいとします。
そんな場合は、InStrRevを使いましょう。
Sub test()
Target = "hello world hello"
pos = InStrRev(Target, "hello")
MsgBox pos
End Sub
実行すると13が表示されるはずです。
“hello world “で12文字なので、確かに右の”hello”の位置が取得できています。
ただし、出力される位置は左から数えるので注意してください。
使用例:InStrで特定の項目だけコピペする
以下のように、2つのファイルが存在するとします。
“Book1.xlsx”から”A”のデータのみをコピーしてみましょう。
①シートを指定する
Sub test()
Dim copyWs As Worksheet
Dim pasteWs As Worksheet
Set copyWs = Workbooks("Book1.xlsx").Worksheets(1)
Set pasteWs = ThisWorkbook.Worksheets(1)
End Sub
copyWsとpasteWsで、コピーするデータのあるシートと、貼り付け先のシートを定義しました。
例えば、copyWs.Cells(1, 1)と書けば”Book1.xlsx”の1枚目のA1セルを指定できます。
②”A”の行番号を取得する
今回紹介したInStrで、”A”が含まれるセルの行番号を取得しましょう。
Sub test()
Dim copyWs As Worksheet
Dim pasteWs As Worksheet
Set copyWs = Workbooks("Book1.xlsx").Worksheets(1)
Set pasteWs = ThisWorkbook.Worksheets(1)
endRow = copyWs.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To endRow
If InStr(copyWs.Cells(i, 1), "A") > 0 Then
MsgBox i
End If
Next i
End Sub
for文で2~最終行まで処理を実行し、InStrで”A”を含むか確認します。
もし含まれるなら、MsgBoxが起動して行番号が表示されるはずです。
最終行は、CountとEndを組み合わせて自動取得しました。
>>Excelマクロで最終行(列)を取得する方法
実行してみて2,5,8…が表示されれば成功です。
③”A”のみをコピーする
先ほど取得できた行番号を使って、コピペしていきましょう。
Sub test()
Dim copyWs As Worksheet
Dim pasteWs As Worksheet
Set copyWs = Workbooks("Book1.xlsx").Worksheets(1)
Set pasteWs = ThisWorkbook.Worksheets(1)
endRow = copyWs.Cells(Rows.Count, 1).End(xlUp).Row
r = 2
For i = 2 To endRow
If InStr(copyWs.Cells(i, 1), "A") > 0 Then
copyWs.Cells(i, 2).copy
pasteWs.Cells(r, 1).PasteSpecial
Application.CutCopyMode = False
r = r + 1
End If
Next i
End Sub
CopyでコピーしてPasteSpecialで貼り付けます。
>>Excelマクロでコピペをする方法
まとめ
今回はInStrの使い方を解説しました。
if文との相性が良いのでぜひ使ってみてください。
コメント