• ベストアンサー

検索文字が右から何文字目にあるか文字位置を取得

検索文字が右から何文字目にあるか文字位置を取得したいのですが 2文字指定できないのでしょうか? Sub test01() Debug.Print InStr(1, StrReverse("abcde"), "cd") End Sub だと、0が返りますが、 Sub test02() Debug.Print InStr(1, StrReverse("abcde"), "c") End Sub だと3が返ります。 複数の文字の検索文字が右から何文字目にあるか文字位置をする方法を ご教授ください。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.4

そりゃぁ・・・ > Debug.Print InStr(1, StrReverse("abcde"), "cd") 「StrReverse("abcde") → "edcba"」でしょうから、"cd"は見つからないでしょう・・ 検索する文字列も左右を入れ替えて   Debug.Print InStr(1, StrReverse("abcde"), StrReverse("cd")) でしょうねぇ。 でもこれだと返り値は「2」でしょうから、もう一工夫でしょうか。   Debug.Print InStr(1, StrReverse("abcde"), StrReverse("cd")) + Len("cd") - 1 こんな感じで。 もう少しわかりやすく   Debug.Print Len("abcde") - InStr(1, "abcde", "cd") + 1 でも良いでしょうけどね。 追記) 多分、ですが、「例」がよろしくないです。 "abcde"の中の"c"ですから、左からでも右からでも「3文字目」ですよね。 「例」として選ぶなら、もう少し工夫した方が良いかもしれませんね。 ※ Debug.Print Len("abcdefg") - InStr(1, "abcdefg", "e") + 1   左から5文字目、右からは3文字目ですね。

fjrbsmpqkkxux
質問者

お礼

回答ありがとうございました。

その他の回答 (3)

回答No.3

補足:-(M - 1) を書くのか否かは質問者の考え次第!

fjrbsmpqkkxux
質問者

お礼

回答ありがとうございました。

回答No.2

Public Function InstrRight(ByVal Text1 As String,               ByVal Text2 As String) As String   Dim L As Integer   Dim M As Integer   Dim N As Integer   L = Len(Text1)   M = Len(Text2)   N = InStr(1, Text1, Text2)   InstrRight = IIf(N = 0, 0, L - N + 1 - (M - 1)) End Function 既存の関数で無理な場合は自作するしか・・・。 実行結果は添付図を。

fjrbsmpqkkxux
質問者

お礼

回答ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

ふつーに sub macro1() debug.print instr(1, strreverse("abcde"), strreverse("cd")) end sub とかで。

fjrbsmpqkkxux
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • 引数 compareについて

    エクセルで Sub sample() Debug.Print InStr(1, "abcde", "C", vbTextCompare) End Sub このコードを実行する際、vbTextCompareはどういう役目を果たしてるのでしょうか? Sub sample() Debug.Print InStr(1, "abcde", "C") End Sub や Sub sample() Debug.Print InStr(1, "abcde", "C", vbBinaryCompare) End Sub にすると0が返りますが、 なぜ0が返るのかわかりません。 ヘルプを読むと、vbTextCompareは 「テキスト モードの比較を行います。」と書いてありますが、それがどういう意味なのか分かりません。 Sub sample() Debug.Print InStr(1, "abcde", "C", vbDatabaseCompare) End Sub にすると、エクセルで実行しているからかエラーになりました。 Sub sample() Debug.Print InStr(1, "abcde", "C", vbUseCompareOption) End Sub これだと、コンパイルエラーになりました。

  • InStr関数、InStrRev関数

    Sub Sample() Debug.Print InStr(1, "abcde", "d") Debug.Print InStrRev("abcde", "d") End Sub どちらの関数も結果が4で、同じなのですが、InStrRevは2になるべきではないですか? なぜ左から検索してるのでしょうか?

  • computerNameを取得したい

    UserNameではなく、computerNameを取得したい エクセルで複数人でファイルを開いてる場合、 コンピューター名を取得したいのですが Sub test1() Dim v As Variant v = ActiveWorkbook.UserStatus Debug.Print v(1, 1) End Sub これをやると、UserNameが取得されます。 UserStatusの中には、computerNameは格納されないのでしょうか? Sub test() Debug.Print Environ("computerName") End Sub で、自身のコンピューター名は取得できるのですが 複数ファイルを開いているときのみんなのコンピューター名を取得する方法を教えてください。

  • 右から何文字目にあるか文字位置を取得するには?

    関数で検索文字が右から何文字目にあるか文字位置を取得するには? FIND関数は左から検索文字が何文字目にあるかを取得しますよね。 右から取得するための関数は用意されてますか? vbaで言うと、StrReverse関数みたいなのはワークシート関数にはないのですか?

  • 右からループするにはどうすればいいですか?

    Sub test() For Each s In Worksheets Debug.Print s.Name Next End Sub これでシート名を取得する際は左から取得されますが 右からループするにはどうすればいいですか?

  • エクセルvba 検索対象をシートではなく、ブック全

    このコードでシート内に検索文字があるかどうかを取得できるのですが 検索対象をシートではなく、ブック全体にするには どうすればいいでしょうか? Sub Sample() If Not Cells.Find(What:="test", LookAt:=xlPart) Is Nothing Then Debug.Print "あります" Else Debug.Print "ありません" End If End Sub

  • lenは文字数を取得する関数ですよね?

    vbaで Sub test() Dim i As Long Debug.Print Len(i) End Sub とすると、4が返るのですが、なぜなのかまったくわかりません。 iには0が入っているので、一文字だから1が返ると思うのですが・・・

  • Excel VBA テキストボックスの値の取得

    テキストボックスの値が必要となり参照しようと思い、検索したところdebug.printにある3つの方法がヒットし、試して見ましたが、エラーになります。 テキストボックスの名前にはどれもtxtの文字を含んでいます。 Sub ShapeValue() Dim Shp As Shape For Each Shp In ActiveSheet.Shapes If InStr(Shp.Name, "txt") <> 0 Then Debug.Print Shp.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません。 Debug.Print Shp.TextFrame2.TextRange.Text '指定された値は境界を超えています。 Debug.Print Shp.ShapeRange.TextFrame.Characters.Text 'オブジェクトは、このプロパティまたはメソッドをサポートしていません End If Next Shp End Sub どうすれば取得できるでしょうか?

  • ブック内のシート名を右から取得したい

    Sub Sample() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub このコードを実行すると、左からシート名をひとつずつ取得しますが 右から取得して書き出すにはどうすればいいでしょうか?

  • VBA 複数の文字のコードを一気に返すには

    Sub test1() Dim myStr As String myStr = "abc" Debug.Print Asc("a") Debug.Print Asc(myStr) End Sub このコードは、どちらも97が返るのですが、 myStrは3文字です。 3文字全ての文字コードを返すには、 Sub test2() Dim myStr As String myStr = "abc" Debug.Print Asc(Mid(myStr, 1, 1)) & Asc(Mid(myStr, 2, 1)) & Asc(Mid(myStr, 3, 1)) End Sub のようにするしかないのでしょうか?

専門家に質問してみよう