今回は、特定の文字の抽出方法を紹介します。
実務でもあるあるだと思います。
特定の文字から、後ろも文字を抽出というような案件です。
目次
VBAで特定の文字列を抽出
こんにちは。伊川(@naonaoke)です。
今回は、面倒はVBAにまかせろ その1の続きを紹介します。
[馬連マトリクス](馬連人気順) 2019年 8月31日(土)札幌 2回 5日 9R 14.15発走
この文字列から、TRIM関数 MID関数 FIND関数を使って、
2019
8
31
というように、特定の文字を抽出することでした。
VBAで文字列を操作する場合は、InStr関数を利用します。FIND関数と使い方は、似ているのですが、若干の変更があります。それでは、InStr関数の利用方法を確認していきましょう。
お時間のある時に、読んでいただければ幸いです。
このブログはこんな人にお勧め
- VBAを利用して、特定の文字を抽出したい人
- VBAの勉強を始めた人
- 競馬のデータベースを作成したい人
このブログを読み終わるころには
InStr関数の使い方
読み方は、【インストリング関数】といいます。伊川は、【インスタ関数】と読んでいましたが、間違いです。
たとえば、下記のようなシートがあったとします。
Sub テスト() MsgBox InStr(Range("B2"), "c") End Sub
MsgBoxに【3】と表示されます。つまり、【C】は、文字列の3番目にあるからです。
コードを音読すると下記のようになります。
MsgBox MsgBoxに表示しなさい。
InStr(Range(“B2”), “c”) セルB2の文字列のCの位置(InStr関数の命令によるものです)
FIND関数と、InStr関数の比較
これが前回紹介したFIND関数の使い方です。
似ていますが、異なる点は、
FIND関数⇒最初に、検索したい文字を指定
InStr関数⇒最初に、検索する場所を指定
この点が、反対になっています。
それだけですか?って、そうそれだけなんです。
2019を抽出する場合
=TRIM(MID(A1,FIND(")",A1)+1,FIND("年",A1)-FIND(")",A1)-1))
Range("B3") = Trim(Mid(Range("A1"), InStr(xx, ")") + 1, InStr(Range("A1"), "年") - InStr(Range("A1"), ")") - 1)) Dim xx As String xx = Range("A1") Range("B3") = Trim(Mid(xx, InStr(xx, ")") + 1, InStr(xx, "年") - InStr(xx, ")") - 1))
変数を利用してコードを短くしています。
札幌 2回 5日 9Rを抽出する
この場合は、少し、ヒネリが必要です。
[馬連マトリクス](馬連人気順) 2019年 8月31日(土)札幌 2回 5日 9R 14.15発走 から
札幌 2回 5日 9Rをいきなり抽出するために、必要な情報は、【(土)】になります。
そして、抽出漏れがないように、【(土)を含む】としてワイルドカードを使います。
ワイルドカードについては、また別の機会で説明しますが、【(土)という文字が含んでいたら】という事を
コードで表します。そうすると、下記のようになります。
※検証では、ワイルドカードを利用しなくても、抽出できています。
If xx Like “*(土)*” Then
Range(“B7”) =Trim(Mid(xx, InStr(xx, “(土)”) + 3, InStr(xx, “R”) – InStr(xx, “(土)”) – 1))
また、競馬は、基本、土、日、月に開催されますので、このように変更をします。
If xx Like "*(土)*" Then Range("B7") = Trim(Mid(xx, InStr(xx, "(土)") + 3, InStr(xx, "R") - InStr(xx, "(土)") - 1))ElseIf xx Like "*(日)*" Then Range("B7")= Trim(Mid(xx, InStr(xx, "(日)") + 3, InStr(xx, "R") - InStr(xx, "(日)") - 1))ElseIf xx Like "*(月)*" Then Range("B7") = Trim(Mid(xx, InStr(xx, "(月)") + 3, InStr(xx, "R") - InStr(xx, "(月)") - 1))End If
読み方を抜粋するなら、
If xx Like “*(土)*” Then もし、xx(Range(“A1”))に【(土)】を含んでいたら
ElseIf xx Like “*(日)*” Then そうではなくて(Elseif)xx(Range(“A1”))に【(日)】を含んでいたら
ElseIf xx Like “*(月)*” Then そうではなくて(Elseif)xx(Range(“A1”))に【(月)】を含んでいたら
この様に、条件を重ねていきます。Excelの世界では、条件を重ねることをネストといいます。
これで、伊川が抽出したい文字がすべて抽出できたことになります。
この後の説明は、重複しますので、サンプルファイルを参照してください。
実務でのあるあるは、データが整形されていないため、文字の抽出に困ることがあります。
しかし、InStr関数は本当に便利な関数で、これを覚えるだけでスキルが上がると思います。
また、InStr関数は、ACCESSでも利用できますので、ぜひ、みなさんのスキルにしてください。
まとめ
WorkSheetの関数で、Left関数、Right関数、Mid関数を、伊川が始めて勉強したとき、果たして、この関数は意味があるのかという疑問を持ちました。なぜなら、Left関数、Right関数、Mid関数を利用する場面を想像できなかったからです。
しかし、伊川の趣味の場面で、こんなにも利用する場面があったことに驚きです。
仕事上でも、文字列から伊川に抽出できない文字はありません。