- ベストアンサー
VBA文字列の抜き出し方
こんにちは。Excel VBAで文字列を抜き出したいと思っています。 変数には下記のようなデータがはいっています。 hensu = "コード:xxxxx / コード2:yyyy / コード3:zzzzzz" コード2:から始まって/の手前までのデータ、つまりyyyyのみを抜き出したいと思っていますが、どのように抜き出すことができるでしょうか? instrでコード2を検索しても、どのように「/」を検索すればいいのかわかりません。 このあと、ループを使ってyyyyを連続的に抜き出していきたいと思っています。各文字列の文字数は不定です。 宜しくお願い致します!
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
Public Function CutStr(ByVal Text As String, ByVal Separator As String, ByVal N As Integer) As String Dim strDatas() As String strDatas = Split("" & Separator & Text, Separator, , 0) CutStr = strDatas(N * Abs(N <= UBound(strDatas))) End Function 上記のCutStr関数で切り出せます。 抜出し要領は、イミディエイトウインドウのPRINTSCを参考にされて下さい。
その他の回答 (7)
- bin-chan
- ベストアンサー率33% (1403/4213)
hensu = "コード:xxxxx / コード2:yyyy / コード3:zzzzzz" dim strBuff1() as string dim strBuff2() as string strBuff1()=split(hensu, "コード2:") ''ここでは以下の結果を期待 ''strBuff1(0)="コード:xxxxx / " ''strBuff1(1)="yyyy / コード3:zzzzzz" if ubound(strBuff1())>1 then strBuff2()=split(strBuff1(1), "/") ''" / "でも良いかも ''ここでは以下の結果を期待 ''strBuff2(0)="yyyy " ''strBuff2(1)=" コード3:zzzzzz" if ubound(strBuff2())>1 then msgbox strBuff2(0) ''Trimが必要かも endif endif もし、hensuに2回以上「コード2:」が出現するなら if ubound(strBuff1())>1 then の結果を見て strBuff1(1)~strBuff1(max)までループさせてください。
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。
- tsubuyuki
- ベストアンサー率45% (699/1545)
Sub sample() Dim hensu As String Dim HensuB As String, HensuC As String Dim HensuZ As String hensu = "コード:xxxxx / コード2:yyyy / コード3:zzzzzz" HensuB = "コード2" HensuC = Mid(hensu, InStr(hensu, "コード2") + Len(HensuB) + 1) HensuZ = Left(HensuC, InStr(HensuC, "/") - 2) Debug.Print HensuZ End Sub 単純に。 Instr一回で抜けないなら、二回に分けてやれば良いです。
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
Public Sub test() Const PICKUP_CODE_NAME As String = "コード2:" Const CODE_SEPARATOR As String = "/" Dim hensu As String hensu = "コード:xxxxx / コード2:yyyy / コード3:zzzzzz" Dim codeStartPos As Integer codeStartPos = InStr(1, hensu, PICKUP_CODE_NAME) Dim value As String value = Trim(Mid(hensu, codeStartPos + Len(PICKUP_CODE_NAME), _ InStr(codeStartPos, hensu, CODE_SEPARATOR) - codeStartPos - Len(PICKUP_CODE_NAME))) MsgBox value End Sub
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。
- choco-ball
- ベストアンサー率49% (25/51)
いろいろ回答がついていますが、 初心者の私はこのほうが分かりやすいです。 Dim 検索開始文字 As String Dim 検索終了文字 As String Dim 切取開始位置 As Long Dim 切取文字数 As Long Dim 抽出した文字 As String 検索開始文字 = "コード2:" 検索終了文字 = "/" 切取開始位置 = InStr(hensu, 検索開始文字) + Len(検索開始文字) 切取文字数 = InStr(切取開始位置, hensu, 検索終了文字) - 切取開始位置 抽出した文字 = Mid(hensu, 切取開始位置, 切取文字数)
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。
- keithin
- ベストアンサー率66% (5278/7941)
sub macro1() dim hensu as string dim a, res dim i as long dim mes as string hensu = "コード:xxxxx / コード2:yyyy / コード3:zzzzzz" a = split(hensu, " / ") ’区切り記号は調整する事 res = filter(a, "コード2") ’てきとーに見繕う事 ’「抜き出してどうしたい」のか不明なので以下オマケ if ubound(res) = -1 then mes = "NOT FOUND" else mes = ubound(res) + 1 & " item(s) found" for i = 0 to ubound(res) mes = mes & vblf & split(replace(res(i), ":",":"), ":")(1) next i end if msgbox mes end sub #「:」と「:」みたいにデータが整備されていないので余計な処理が発生しています。
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。
- tom04
- ベストアンサー率49% (2537/5117)
No.2です! 前回の説明で間違いがありました。 >そして、必ず「/」はコード2:の後に存在するいう前提です。 >(「/」が存在しないと無限ループに陥ってしまいます) の2行は無視してください。 「/」がない場合は最後まで表示されるだけです。 何度も失礼しました。m(_ _)m
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 一例です。 データはA1セル以降にあり、B列に表示させるとします。 尚、「コード2:」は各セルに1個だけしか出現しない! そして、必ず「/」はコード2:の後に存在するいう前提です。 (「/」が存在しないと無限ループに陥ってしまいます) Sub Sample1() Dim i As Long, k As Long, str As String, buf As String For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row If InStr(Cells(i, "A"), "コード2:") > 0 Then For k = InStr(Cells(i, "A"), "コード2:") + Len("コード2:") To Len(Cells(i, "A")) str = Mid(Cells(i, "A"), k, 1) buf = buf & str If str = "/" Then Exit For End If Next k Cells(i, "B") = Left(buf, Len(buf) - 1) buf = "" End If Next i End Sub ※ 質問文ではyyyyの後にスペースが入っているようですが、 質問通り「/」の前までを表示させるようにしています。 (半角スペースも表示されます。) こんな感じではどうでしょうか?m(_ _)m
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。
お礼
ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。