pickup

今回は、特定の文字の抽出方法を紹介します。
実務でもあるあるだと思います。
特定の文字から、後ろも文字を抽出というような案件です。

目次

VBAで特定の文字列を抽出

こんにちは。伊川(@naonaoke)です。

今回は、面倒はVBAにまかせろ その1の続きを紹介します。

[馬連マトリクス](馬連人気順) 2019年 8月31日(土)札幌 2回 5日 9R 14.15発走

この文字列から、TRIM関数 MID関数 FIND関数を使って、

2019

8

31

というように、特定の文字を抽出することでした。

VBAで文字列を操作する場合は、InStr関数を利用します。FIND関数と使い方は、似ているのですが、若干の変更があります。それでは、InStr関数の利用方法を確認していきましょう。

Naosuke
この記事は、全部で3部作です。
お時間のある時に、読んでいただければ幸いです。
スポンサーリンク

このブログはこんな人にお勧め

今回のテーマ
  • 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を抽出する場合

FIND関数の場合
=TRIM(MID(A1,FIND(")",A1)+1,FIND("年",A1)-FIND(")",A1)-1))

Naosuke
上のコードは、ワークシート上で利用する数式です。

 

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の世界では、条件を重ねることをネストといいます。

これで、伊川が抽出したい文字がすべて抽出できたことになります。

この後の説明は、重複しますので、サンプルファイルを参照してください。

 

ここがポイント
Function8.png
実務でのあるあるは、データが整形されていないため、文字の抽出に困ることがあります。
しかし、InStr関数は本当に便利な関数で、これを覚えるだけでスキルが上がると思います。
また、InStr関数は、ACCESSでも利用できますので、ぜひ、みなさんのスキルにしてください。
動画とブログでわかりやすくExcelとACCESSを紹介しています

まとめ

WorkSheetの関数で、Left関数、Right関数、Mid関数を、伊川が始めて勉強したとき、果たして、この関数は意味があるのかという疑問を持ちました。なぜなら、Left関数、Right関数、Mid関数を利用する場面を想像できなかったからです。

しかし、伊川の趣味の場面で、こんなにも利用する場面があったことに驚きです。

仕事上でも、文字列から伊川に抽出できない文字はありません。

 

結論
VBAは、自分の趣味で活用できるようになると、面白く勉強できる by 伊川 直助
スポンサーリンク

Twitterでフォローしよう

おすすめの記事