• ベストアンサー

VBA文字列の抜き出し方

こんにちは。Excel VBAで文字列を抜き出したいと思っています。 変数には下記のようなデータがはいっています。 hensu = "コード:xxxxx / コード2:yyyy / コード3:zzzzzz" コード2:から始まって/の手前までのデータ、つまりyyyyのみを抜き出したいと思っていますが、どのように抜き出すことができるでしょうか? instrでコード2を検索しても、どのように「/」を検索すればいいのかわかりません。 このあと、ループを使ってyyyyを連続的に抜き出していきたいと思っています。各文字列の文字数は不定です。 宜しくお願い致します!

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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を参考にされて下さい。

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.8

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)までループさせてください。

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.7

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一回で抜けないなら、二回に分けてやれば良いです。

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.6

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

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

いろいろ回答がついていますが、 初心者の私はこのほうが分かりやすいです。 Dim 検索開始文字 As String Dim 検索終了文字 As String Dim 切取開始位置 As Long Dim 切取文字数 As Long Dim 抽出した文字 As String 検索開始文字 = "コード2:" 検索終了文字 = "/" 切取開始位置 = InStr(hensu, 検索開始文字) + Len(検索開始文字) 切取文字数 = InStr(切取開始位置, hensu, 検索終了文字) - 切取開始位置 抽出した文字 = Mid(hensu, 切取開始位置, 切取文字数)

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.4

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 #「:」と「:」みたいにデータが整備されていないので余計な処理が発生しています。

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.2です! 前回の説明で間違いがありました。 >そして、必ず「/」はコード2:の後に存在するいう前提です。 >(「/」が存在しないと無限ループに陥ってしまいます) の2行は無視してください。 「/」がない場合は最後まで表示されるだけです。 何度も失礼しました。m(_ _)m

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! 一例です。 データは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

mellow91
質問者

お礼

ご回答ありがとうございます!助かりました。また非常に勉強になりました。感謝です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBAで特定文字列の個数を高速に調べたい

    文字列の入っている変数内で特定の文字列(今回はvbCrLf)が何個発生しているかを、高速に調べたいのですが、どのような方法があるでしょうか? 現在以下のことをやっています。 数千件のテキストファイルから特定文字列を検索しています。 検索を高速化するために、テキストファイルをバイナリーモードで1つの変数に読み込み、instr関数で検索しています。 見つかった場合、その位置から前にあるvbCrLfをInStrRev関数で、後ろにあるvbCrLfをinstr関数で位置を調べ、元の変数からmid関数で該当ラインを取り出しています。 検索はこれで可能ですが、特定文字列を調べたinstr関数の戻り値がテキストファイルの先頭からの位置(何桁目)なので、検索した文字列が何行目にあるか分かりません。 変数の検索文字が見つかった位置までの部分でvbCrLfが何個発生しているかが分かれば行数が判定できます。 vbCrLfを調べるinstr関数を何回も繰り返せば行数の判定は可能ですが、もっと高速に(一つの関数・命令で)調べることはできないでしょうか? また他に行数を特定する良い方法があったら教えてください。 よろしくお願い申し上げます。

  • VBAでの文字列操作

    VBAでsの文字列からtの文字列を削除したssの文字列を生成したいのですが どのようにすれば、いいのでしょうか? s = "AAABBBCCCDDDEEE" t = "BBCC" 'を取り除いて ss = "AAABCDDDEEE" としたいです。tは "AAA"だったり、"ABBB"だったりしても その文字を省いた文字列を生成したいです。 VBAの文字列処理でInStrは使われるのでしょうか?

  • 特定文字列の抽出

    VB6の質問です。 桁数、データが不定の文字列中から特定文字を抽出したいのでが、方法を教えていただけないでしょうか? 抽出したいデータの桁数が毎回不定でMid, Left, Right関数が使用できません。 Dim Buffer As String Buffer = "A12345...B678910.TRAGET..C" '桁数、データが不定の文字列がBufferに入ります。 例えば、変数Bufferから、桁数を考慮しないで"TARGET"の文字列を抽出したのです。 InStr関数で、位置を特定して、Mid関数などで抽出するれば、良いと思うのですが これをどんな桁数のときも対応できるようにルーチン化にできないでしょうか?

  • vba isStrってないの? 文字列か評価したい

    IsArrayとかならあるのですが、isStrってないのでしょうか? 変数の値が文字列なのかどうかを評価したいのですが そういう場合、どのvbaコードを使えばいいのでしょうか?

  • 文字列検索で

    よろしくお願いします。 文字列検索instr関数で、特定文字(スペース)でない文字を検索したいのですが、どのようにしたらいいですか? instr関数では、できないのでしょうか? たとえば、 文字列" osietegoo "  →  3 文字列"    situmon"  →  7 スペースでない文字が出現する位置を知りたいです。 instr(文字列,"o")ではなく、" "ではない、、、としたいのですが、できますか?

  • アクセス2000のVBAで変数に係数をつける方法

    アクセス2000を使っています。 一つのレコード内に、下記のように、「半角4文字の番号+スペース」という規則正しいデータがあります。  ↓↓ 11A11 10A11 22B11 09A22 しかし、このデータの数は不規則で、番号が1個のものもあれば、20個のものもあります。  ↓↓ 11A11 11A11 10A11 22B11 09A22 ・・・ このデータ内にある半角4文字の番号を全て別々のデータにしたいと思い、VBAのコードを使って、InStr関数でスペースを検索し、そのスペースの手前から4文字のデータをleft関数やMid関数で抽出し、それを変数data(x)に代入し、次に、InStr関数で前のスペースの位置から次のスペースを探して、また、そのスペースの手前から4文字のデータをMid関数で抽出し、それを変数data(x)に代入する。 要するに、data(x) の中の x を1から1づつ増加させていき、data(1),data(2),data(3)という変数を自動的に生成し、その生成された各変数にデータを代入していきたいのですが、どうすればいいのでしょうか?

  • 【VBA】 文字列の中から指定の文字列を取り出す

    VBAで文字列から指定の文字のn番目からn+1番目までの文字列を取り出すことは可能でしょうか? A1セルに下記の文字列があった場合、「1番目の半角スペースから2番目の半角スペースまでの文字列」を取り出したいのです。 5 53 00 8R この場合、53を取り出したいというわけです。 また、可能でしたら「最後の半角スペースから文字列の最後まで」を取り出す方法も教えていただけるとありがたいです。 この場合は8Rとなります。 InStr関数を使えばできるかもと思ったのですが、できそうなものが思い浮かびません。 どなたか教えていただけませんでしょうか。 よろしくお願いいたしますm(_ _)m

  • 文字列検索で・・・

    Instr関数で文字列の存在チェックを行っています。 この場合、変数indexに1が入った場合 Instr("aaa1_a.sql","index") <----- この場合問題はないのですが、 Instr("aaa12_a.sql","index") <-----となる場合も値がとれてしまうので どうしたものかと困っています。 うまく検索させる方法はないでしょうか? ちなみに検索する文字列には aaa数字.sql aaa数字_a.sql aaa数字_b.sql というパターンがあります。 どなたかよきアドバイスをいただけませんでしょうか? よろしくお願い致します。

  • エクセルVBA、列のコピーについて

    VBAについて助けてほしいことがございます! VBA初心者なので、ひょっとしたらレベルの低い質問かもしれず申し訳ないのですが、VBAに詳しい方がいらっしゃれば教えて欲しいことがあります。 下記の前提を含めた作業内容をVBAのコードとしてまとめる事は出来るのでしょうか? 1列目(A1,B1,C1,D1…)にキー項目(名前、番号、地域、住所、ID…)、2列目以降にキー項目のデータが入力されています。 【作業内容】 「ID」の項目の列には、「番号」の列の文字をコピーして貼りつける(キー項目は上書きせずにIDのまま)。 【前提】 ・キー項目の列は固定されていない(B列が番号の時もあれば、住所の時もある)ので、文字を基準にコピー作業をする ・「キー項目が空欄にぶつかったら、検索を終了」という事をループに入れる(キー項目数は変動するため) ・2列目以降の全てのデータをに張り付ける」という事をコードに入れる(2列目以降のデータの列数も変動する且つ途中に空欄も含むため)

  • 変数内の文字列にある最後の「"」位置を調べたい。

    変数myStrに格納されている文字列に幾つか含まれる文字「"」のうち、最後の「"」が文字列の何文字目に有るか出したいです。 InStr(1,myStr,""") 普通にInstrを使うと最初の文字位置を返してきます。 また「"」は"""になってしまいます。

このQ&Aのポイント
  • Windows8.1から10.1へのダウンロードが、microsoftの公式サイトからアクセスしてもうまくいかない。
  • ソースネクスト株式会社の製品・サービスについての質問です。
  • Windows8.1から10.1へのダウンロードに関して、microsoftの公式サイトで問題が発生しているようです。詳しくはソースネクスト株式会社の製品・サービスについて質問してください。
回答を見る

専門家に質問してみよう