自分方位研究所

日々の活動記録

(Excel VBA) タグから文字を抜き出す(Left / Mid / Right 関数を使う)

昨日は、Left / right / Replace 関数を用いて文字の抜き出しをやってみました。
Replace 関数は、文字の置き換えなので、不用な文字を消去するという方法でやっていますが、もし抜き出したい文字列の中に同一文字列があったら、それらも消去してしまうので、今回は Replace 関数を使わず、Mid関数を利用して文字抜き出しコードを作成しました。

以下の例では、「抜き出し改」プロシージャから、文字抜き出し処理用の「Function NUKIDASImid」を呼び出します。

Function NUKIDASImid の使用例(呼び出し方)

NUKIDASImid (AllText , mark1 , mark2 )

AllText : 抜き出したい文字列を含む、全体の文字列
mark1 : 抜き出したい文字列の直前にある目印用文字列
mark2 : 抜き出したい文字列の直後にある目印用文字列

・*mark1抜き出す文字列mark2*

・*mark1抜き出す文字列 → mark2 ="" を指定

・抜き出す文字列mark2*    → mark1 ="" を指定

--------------------------------------------------

mark1は、前方から検索する InStr を使用し、
mark2は、後ろから検索するInStrRev  を使用しています。

どちらも検索開始位置は設定していませんので、  InStrは先頭(左端)から、InStrRevは一番最後の文字(右端)から、それぞれの位置を取得しています。

なので、目印となる、mrk1、mark2 が複数の箇所に存在すると、うまくいかない場合があります。

以下の「抜き出し改」を実行すると、イミディエイトウィンドゥに以下のように出力されます。

<a class="entry-title " href="https://hatena.jp/edit?entry=1234567">記事題名</a>
entryTitle=【記事題名】
editURL=【https://hatena.jp/edit?entry=1234567
editID=【1234567】
黒丸=【●●●】

Sub 抜き出し改()


Dim textAll As String
Dim entryTitle As String
Dim editURL As String
Dim editID As String
Dim textAll2 As String
Dim kurommaru As String


textAll = "<a class=""entry-title "" href=""https://hatena.jp/edit?entry=1234567"">記事題名</a>"
Debug.Print textAll

entryTitle = NUKIDASImid(textAll, ">", "</a>")
Debug.Print "entryTitle=【"; entryTitle & "】"

editURL = NUKIDASImid(textAll, "href=""", """>")
Debug.Print "editURL=【"; editURL & "】"

editID = NUKIDASImid(editURL, "entry=", "")
Debug.Print "editID=【"; editID & "】"

'--------------------------------------------------

textAll2 = "●●●「●を抜き出す」"
kurommaru = NUKIDASImid(textAll2, "", "「")
Debug.Print "黒丸=【"; kurommaru & "】"

End Sub

--------------------------------------------------

Function NUKIDASImid(allText As String, mark1 As String, mark2 As String) As String

'2020/6/18(木)14:03
'--------------------------------------------------
'Mid関数を使用
'--------------------------------------------------

'対象型
'***[目印(mark1)]抜き出し文字[目印(mark2)]***

'***:任意の文字列。無しでも可。

'***[目印(mark1)]抜き出し文字 → mark2="" を指定
'抜き出し文字[目印(mark2)]*** → mark1="" を指定
'--------------------------------------------------


'allText: 文字列全体
'mark1: 抜き出し文字列直前の目印文字列(直後には抜き出し文字列が続いていること)
'mark2: 抜き出し文字列直後の目印文字列(直前には抜き出し文字列末尾があること)

'--------------------------------------------------
Dim allLen As Integer
Dim mark1Len As Integer
Dim mark2Len As Integer
Dim tgtLEN  As Integer
Dim mark1Instr As Integer
Dim mark2Instr As Integer


allLen = Len(allText)   '全文字列の文字数
mark1Len = Len(mark1)   '前方目印の文字数
mark2Len = Len(mark2)   '後方目印の文字数

mark1Instr = InStr(allText, mark1)  '前方目印位置
mark2Instr = InStrRev(allText, mark2)   '後方目印の位置


'***mark1●mark2***

If mark1Len + mark2Len = 0 Then '""●""
    NUKIDASImid = allText
    Exit Function
End If

If mark1Len = 0 Then    '●mark2***
    NUKIDASImid = Left(allText, mark2Instr - 1)
    Exit Function
End If

If mark2Len = 0 Then    '***mark1●
    NUKIDASImid = Right(allText, allLen - (mark1Instr + mark1Len - 1))
    Exit Function
End If


'抜き出し文字の長さ

'   |      |
'12345678901234567
'***mark1●mark2***

tgtLEN = (mark2Instr - 1) - (mark1Instr + mark1Len - 1)
'tgtLEN = mark2Instr[10]-1 - (mark1Instr[4] + mark1Len[5]-1)

NUKIDASImid = Mid(allText, mark1Instr + mark1Len, tgtLEN)

End Function