• ベストアンサー

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/17068)
回答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

  • ExcelのVBAで下線のついている文字列の前後の位置を取得したい。

    ExcelのVBAで下線のついている文字列の前後の位置を取得したい。 例えば、下記のような文章で「sample」という文字列に下線がついている場合 「sample」の文字列の前後の位置(4,10)を取得したい これはsampleの文章です。 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003 ご存知の方がおられましたらご回答をよろしくお願いします。

  • 選択した文字列の位置と文字数を取得したい(VBA)

    セルや図形にテキストを入力し、 そのテキストの一部分を選択した状態でマクロを実行した時に、 何文字目から何文字目までを選択しているのかを取得するコードを ご存知の方がおられましたら教えていただけませんでしょうか? 文字列の内容、選択する部分は決まっていません。 使用環境は、Windows7とMicrosoft Excel2010です。 よろしくお願いいたします。

  • outlook vba 文中の文字列取得

    outlook vba 文中の文字列取得 本文中に、 日付:9/10 名前:田中 住所:東京 とあるとき、田中 を取得したいのですが、 名前: から改行までの文字列について、 Mid(objItem.Body, InStr(objItem.Body, "名前:") + 4, (InStr(InStr(objItem.Body, "名前:"), objItem.Body, vbCrLf))) で取得しようとしましたがうまくいきません。 田中からあとすべてが取得されてしまいます。 何か間違っていますでしょうか?

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

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

  • Excel VBA こういう関数を作りたい

    Excel VBAにてこういう関数を作りたいのです。 SInstr(検索する文字列,検索する文字,何番目) INSTRでは一番最初の位置しか返してもらえないので、任意の見つかった場所の位置を返して欲しいのです。 例: SInstr("あいうえおかうえきうえ","うえ",3) 10を返す 2つめくらいのならinstrで見つかった場からネストして+1すればいいんですが、4つめ,5つめという物もあるのです。 当方頭が悪いので思いつきませんでした。 頭の良い方、どういう関数を書いていいか教えていただけないでしょうか?

  • 文字列の取得について

    Accessのモジュールを使ってある文字列から指定した文字数の文字列を取得しようとしています。 A:"あああああ" & vbcrlf B:"いいいいい" & vbcrlf C:"うううううう" & vbcrlf D:"えええええ" & vbcrlf A~Dまでフィールドがあり、vbcrlfは改行です。 この文字列に対して以下の処理を実行します。 (1)変数mojiにA & B & C & Dを代入 (2)mojiを全角に変換 (3)Left(moji,20)で左から20文字取得します。 (4)mojiをテキストボックスに登録します。 (5)入力チェック処理  ・フィールドサイズが20文字以内か?  ・全角で登録されているか? →登録後のイメージ ---------------- あああああ いいいいい ううううう ---------------- テキストボックスには全角でしっかり登録されているようにみえるのですが、 どうしても全角で登録してくださいというメッセージが表示されてしまいます。 うううううの次の改行を削除すると、メッセージはでなくなります。 この改行が半角になっているのでしょうか? アドバイスよろしくお願いいたします。

  • 文字列検索で

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

  • 画面から文字列を取得してその文字列の位置を知る方法

    こんばんは。 質問させてください。 画面から文字列を選択して、取得します。(これは出来ました。) その文字列がHTMLソースファイルの どの位置のものか取得する方法はありますでしょうか? ○番目の「こんばんは」を画面から取得した時に 同じ文字列があっても、○番目の位置が取得出来る方法なのですが・・・ ---- <HTML><HEAD></HEAD> <BODY> おはよう、こんばんは。 さようなら、ありがとう。 しつれいしました、おはよう、こんばんは。 こんばんは、さようなら。 さようなら </BODY> </HTML> ----

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

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

  • Wordの選択した文字列をVBAを使用してExcelにペーストしたい

    a.docにある「サンプル」という文字列を選択後、 マクロの実行でb.xlsのA1にペーストするには どうすればよいのでしょうか? 使用OS:Windows XP 使用ソフト:Microsoft Excel 2003 ご存知の方がおられましたらご回答をよろしくお願いします。

専門家に質問してみよう