昨日は、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
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)
If mark1Len + mark2Len = 0 Then
NUKIDASImid = allText
Exit Function
End If
If mark1Len = 0 Then
NUKIDASImid = Left(allText, mark2Instr - 1)
Exit Function
End If
If mark2Len = 0 Then
NUKIDASImid = Right(allText, allLen - (mark1Instr + mark1Len - 1))
Exit Function
End If
tgtLEN = (mark2Instr - 1) - (mark1Instr + mark1Len - 1)
NUKIDASImid = Mid(allText, mark1Instr + mark1Len, tgtLEN)
End Function