• ベストアンサー

ExcelのVBAで文章にある複数の同じ文字列の位置をそれぞれ取得したい

下記のような記述だと1つめのsampleの位置(9文字目)は取得できても 2つめのsample(25文字目)の位置を取得することができません。 どうすれば2つめの文字列の位置を取得することができるのでしょうか? moji = "This is sample text for sample." n = InStr(moji, "sample") 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003 ご存知の方がおられましたらご回答をよろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

下記のどちらとも取れる表現だ。 質問例からは(2)かな。 (1)セルの探索 マクロの記録状態にして、操作で、編集ー検索をやってみて、記録されたコードをみて、自分の場合はどこを、どう修正したらよいか考え、疑問が多分残るだろうから、それに絞って質問する。 普通の質問はこっちの方だが。 ーー (2)1セル内 >文章にある複数の同じ文字列の位置をそれぞれ 1セル内の文字列内の2度目以降の出現を聞いているのか その場合は繰り返しを行い、nが0になった場合でInstr実行を終了する。下記のInstrの探索のスタートポイント(下記でs)を活用するのがミソだ。 Sub test01() a = Cells(1, 1) s = 1 Do n = InStr(s, a, "dr") If n = 0 Then Exit Sub MsgBox Mid(a, n, 2) s = n + 1 Loop End Sub 探索しているのが、語句なら上例で「dr+スペース」などを考えれば よいかもしれない。

nana_watuki
質問者

お礼

ご回答を参考にして、下記のように作ってみました。 Sub test01() s = "This is sample text for sample." i = 1 Do n = InStr(i, s, "sample") If n = 0 Then Exit Sub MsgBox n & "文字目にsampleがあります" i = n + 1 Loop End Sub ご回答いただきどうもありがとうございました。

その他の回答 (4)

回答No.4

こんにちは 3つ目以上の場合はわかりませんが、2つ目なら後ろから数える 方法があるようです。 moji = "This is sample text for sample." m = InStrRev(moji, "sample") '←こいつです。後ろから検索 n = InStr(moji, "sample") MsgBox (Str(m)) MsgBox (Str(n)) とりあえず、ご参考まで^^;

nana_watuki
質問者

お礼

なるほど、2つ限定であればこういう書き方もあるのですね。 ご回答いただきどうもありがとうございました。

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

#1、#2です。たびたびすみません。 #2は無かったことにしてください。 #1の誤)n2 = InStr(n , moji, "sample") #2の誤)n2 = InStr(n + Len("sample"), moji, "sample") 正)n2 = InStr(n + 1, moji, "sample")

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

#1です。失礼しました。以下のとおり訂正。 誤)n2 = InStr(n , moji, "sample") 正)n2 = InStr(n + Len("sample"), moji, "sample")

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

InStrは、開始位置の指定ができます。省略でき、初期値は1なので気が付きにくい。 moji = "This is sample text for sample." n = InStr(moji, "sample") n2 = InStr(n, moji, "sample") でも、Splitで分割件数を数える方が楽ですよ。 dim strArrey() as string dim nArrey as long moji = "This is sample text for sample." strArrey() = split(moji, "sample") 'ここでは以下のとおりに分割されている 'strArrey(0)="This is " 'strArrey(1)=" text for " 'strArrey(2)="." nArrey=UBound(strArrey()) 'nArreyは分割されている件数を拾えるので2となる(ZeroOriginです)

nana_watuki
質問者

お礼

InStrに開始位置があるとは知りませんでした。 ご回答いただきどうもありがとうございました。

関連するQ&A