長い文字列のうち、途中から途中までを抽出したい時にどうするか?
ちょっと複雑なので備忘録を作りました。
何文字目からがわかっていればLeftやRightが使えますが、
何文字目にあるかわからない時にはInstrで見つけます。
見つけたい文字をInstrで調べてMIDで抽出する
例えばA1セルに「2024/5/5_みかん」という文字があり
「みかん」だけを抽出したい場合
Instrで_の位置を調べます。
Dim wkUnderber As Long
wkUnderber = InStr(Cells(1, 1), “_”)
MsgBox wkUnderber
wkUnderber には9が入ります。
2024/5/5_みかん
↑アンダーバーは9文字目
そしてMIDを使います。
Dim wkUnderber As Long
Dim wkString As String
wkUnderber = InStr(Cells(1, 1), “_”)
wkString = Mid(Cells(1, 1).Value, wkUnderber + 1)
MsgBox wkString
Dim wkUnderber As Long
Dim wkString As String
wkUnderber = InStr(Cells(1, 1), "_")
wkString = Mid(Cells(1, 1).Value, wkUnderber + 1)
MsgBox wkString
結果は下記のと折りです。

応用編:文字の途中から途中までを抽出する(InstrとMid)

上記のように6文字目から果物の名前があり、さらに_と数字がある場合
果物の名前だけを抽出したいとします。
Dim wkUB1 As Long
Dim wkUB2 As Long
Dim wkString As String
wkUB1 = InStr(Cells(1, 1), "_")
wkUB2 = InStr(wkUB1 + 1, Cells(1, 1), "_")
wkString = Mid(Cells(1, 1).Value, wkUB1 + 1, wkUB2 - wkUB1 - 1)
MsgBox wkString
結果は下記のようになります。

さらにA列最後までの内容も出力するには下記のようにfor nextを使います
Dim wkUB1 As Long
Dim wkUB2 As Long
Dim wkString As String
Dim i As Long
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
wkUB1 = InStr(Cells(i, 1), "_")
wkUB2 = InStr(wkUB1 + 1, Cells(i, 1), "_")
wkString = Mid(Cells(i, 1).Value, wkUB1 + 1, wkUB2 - wkUB1 - 1)
MsgBox wkString
Next i
結果


コードの説明 Instr
コードを細かく説明します。
Instr(文字列, 探したい文字)
または
Instr(探し始めの位置, 文字列, 探したい文字)
というように記述します。
wkUB1 = InStr(Cells(i, 1), “_”) で最初の_の位置を探してwkUB1に入れます。
さらに2回目の_を探すには、
wkUB2 = InStr(wkUB1 + 1, Cells(i, 1), “_”)で、
最初の_の位置に1を足したところから探し始めます。
wkUB2には、2回目の_の位置が入ります。
例として、
aaaa_みかん_1100 という文字列の最初の_の位置は5
5文字目から、さらに_を探すと9文字目にあります。
コードの説明 Mid
Midは文字の途中から途中、また最後まで抽出するときによく使用します。
Mid(文字列, 抽出の開始文字位置, 文字数)
文字数は省略すると最後の文字まで抽出できます。

※_の位置検索方法は、については前の項目をご覧ください。
コードの説明 Cells(Rows.Count, 1).End(xlUp).Rowで最終行を調べる
Cells(Rows.Count, 1).End(xlUp).Rowは
最終行を調べる時に使います。
途中で空白が入っている時に使います。
例は、A列の最終行です。
ちなみに途中に空白が入っていない場合は
End(xlDown)でも大丈夫です。
コードの説明 For Next
いずれループの記事でまとめて書きますが
一番理解しやすいループです。
For i = 1 to 100
(繰り返す処理)
Next i
上のように記述すると、iという変数が
繰り返す処理が一回終わるたびに
1ずつ増えて、100になるまで繰り返します。
Next i が、ここでiの値が1つ加算されると考えると
理解しやすいかもしれません。





