VBAで特定の文字列を抽出

こんにちは。伊川です。

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

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

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

2019

8

31

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

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

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))
InStr関数の場合

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

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

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

 

まとめ

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

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

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

 

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

Twitterでフォローしよう

おすすめの記事