• 締切済み

InStrRev関数の使い方について

後方から検索にならず、簡易な物で試して居ります。 Dim myStr As String myStr = "54321" MsgBox InStrRev(myStr, "5") 5が出て欲しいが、1と出ます。 間違いは何処でしょうか。 InStrRevを間違って覚えているのか。。。 宜しくお願い致します。

noname#233045
noname#233045

みんなの回答

  • chie65535
  • ベストアンサー率43% (8524/19375)
回答No.3

「54321」を後ろから探して最初に見付かる「5」は「1文字目」にある「5」なので、InStrRevは「1」を返します。 「54321543」の場合を試してみて下さい。後ろから探して最初に見付かる「5」は「6文字目の5」なので6が返ってきます。 「後ろから何文字目にあるか?」が知りたいなら「Len(myStr)+1-InStrRev(myStr,"5")」のように計算します。

noname#233045
質問者

お礼

有難う御座います。 他の関数と混同していた様です。 納得しました。

  • emsuja
  • ベストアンサー率50% (1034/2055)
回答No.2

InStrRev 関数は InStr 関数の変形ですね どちらの関数も、指定された文字列の中から最初に見つかった検索文字の位置を返します InStr 関数は指定された文字列の頭から InstrRev 関数の場合は指定された文字列の最後から検索します 戻り値はどちらの関数でも最初に見つかった検索文字の(文字列の中の頭から数えた)位置を返します。 従って、検索文字列が "54321" の場合は InStr 関数でも InStrRev 関数でも返す値は 検索文字列の中の頭から数えた "5" の位置 "1” を返します、決して InStrRev だからと言って、検索文字列の中の「後ろから数えた文字の位置」を返すことはありません。

noname#233045
質問者

お礼

有難う御座います。 少し前なのでよくは覚えていませんが、まさに「後ろから数えた文字の位置」で誤解していた気がします。

  • kteds
  • ベストアンサー率42% (1876/4424)
回答No.1

>間違いは何処でしょうか。 間違いではないです。 後方から検索して"5"は「文字列の最初から1番目」にあります。(検索方法が「後方から」なのであって、文字列の後方から何番目ということではありません) 確認のためには myStr = "543215" という文字列で試してみてください。

noname#233045
質問者

お礼

有難う御座います。 後方からだと誤解していたようです。

関連するQ&A

  • InStrRev関数とLeft関数とRight関数の組み合わせについて教えてください。

    ワード2002で作成した技術文書について、 (1)(和文字+英数字)の文字列を任意に指定して、 (2)最初に文字数xを求め、 (3)次にInStrRev関数で英数字の1つ前の和文字について、文字列の初めからの数nを求める、 (4)Left関数で和文字を取り出す、(Msgboxに和文字を表示) (5)Right関数で英数字を取り出す、(Msgboxに英数字を表示) というマクロを作りたいのですが、 下記のマクロで足りないところを教えてください。 宜しくお願いします。 Private Sub YougoFugouBetunuki () Dim myText As String Dim x As Integer Dim Yougo As String Dim Fugou As String myText = Selection.Range.Text x = Selection.Characters.Count Fugou = "0-9A-Za-z’" n = InStrRev(myText, Fugou) Yougo = Left(myText, n) Fugou = Right(myText, x-n) End Sub

  • vbaでCountIf関数を使いたい(エクセル)

    A1セルにa-a-aがはいっています。 この場合aは3つですよね。 これをvbaで取得するコードを作っているのですがうまくできません。 Sub test() Dim myStr As String myStr = "a" MsgBox WorksheetFunction.CountIf(Cells(1, 1), "*" & myStr & "*") End Sub これをすると、なぜか1が返ってきます。 Aは3つあるのになぜ1が返るのでしょうか? A1にaaaaaを入れて実行しても1が返ります。

  • 数値かどうかを取得したい IsNumberではダメ

    Sub Macro2() Dim mystr As String mystr = "1" If IsDate(mystr) = False Then MsgBox "NO" End If End Sub これなら日付型かどうかを取得できるのに、 Sub Macro1() Dim mystr As String mystr = "1" If IsNumber(mystr) = False Then MsgBox "NO" End If End Sub だと、IsNumberがコンパイルエラーになります。 変数に入っている値が数値として評価できるかを取得する方法を教えてください。

  • ややこしいですがご協力ください

    アクセスからエクセルを起動してエクセルで実行した変数をアクセスに持って帰りたいです。 【アクセス側】_ Sub エクセルの値を持ってくる() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim MyFileName As String Dim myStr As String Set xlApp = New Excel.Application MyFileName = "C:\Users\エクセル.xlsm" Set xlBook = xlApp.Workbooks.Open(MyFileName) xlApp.Visible = True xlApp.Run "'" & MyFileName & "'!" & "Excel_test" Set xlApp = Nothing MsgBox myStr ’★ End Sub 【エクセル側】 Sub Excel_test() Dim myStr As String myStr = "アクセスへ渡す" MsgBox myStr End Sub としたときに、アクセスの MsgBox myStr ★でも エクセルで実行させた変数を持って帰りたいのですが どこを修正すればよろしいでしょうか? ご教授よろしくお願いします。

  • 配列 変数の宣言 VBA

    こんばんは。 Sub test() Dim myStr(200) As String For 行 = 0 To Cells(Rows.Count, 1).End(xlUp).Row myStr(行) = Cells(行 + 1, 1) Next MsgBox Join(myStr, "_") End Sub のようなコート゛を作成し、 アクティブシートのA列の最終行までを取得し、一つにまとめたいのですが 「Dim myStr(200) As String」の部分で 最終行を取得することは不可能でしょうか? 今回は200行なので大丈夫なのですが 場合によっては1行~65536行までさまざまです。 なので Dim myStr(Cells(Rows.Count, 1).End(xlUp).Row) As String としたらエラーになりました。 最初から Dim myStr(65536) As String とするべきでしょうか? しかしそうすると myStrの最後がずっと「________」となってしまいます。 どうするのが適切なのかわかりません。 ご教授よろしくお願いします。

  • 参照渡しをする時は、渡される側は違う変数を使う?

    参照渡しをする時は、渡される側は違う変数を使うべきなのでしょうか? VBAのお勉強をしているのですが Sub test1() Dim mystr As String mystr = "a" Call test2(mystr) Call test3(mystr) End Sub Sub test2(ByRef mystr As String) MsgBox mystr End Sub Sub test3(ByRef mystr2 As String) MsgBox mystr2 End Sub この場合、test2とtest3ではどちらを使ったほうがいいのでしょうか? test3は、mystr2 というmystrとは違う変数を使っていますが、 test2は、test1のmystrと同じ変数を使っています。 test1と同じ変数を使おうが違う変数を使おうが どちらにしろ (ByRef 変数名 As String) で宣言するから、変わらないのでしょうか?

  • セル番地をvbaで探したい

    エクセルのセルに A1→あ B1→い C1→う がはいっています。 この状態で Sub Macro1() Dim mystr1 As String mystr1 = "c1" MsgBox mystr1 & "の値は、" & "です。" End Sub を実行した時に、mystr1のアドレスを探して、msgboxに表示させたいのですが、 どのような方法があるのでしょうか? アドバイスよろしくお願いします。

  • 【1】と【2】のvbaは同じ意味ですか?

    【1】 Option Explicit Sub test1() Call test2("aaa") End Sub Sub test2(MyStr As String) MsgBox MyStr End Sub 【2】 Option Explicit Dim MyStr As String Sub test1() MyStr = "aaa" Call test2 End Sub Sub test2() MsgBox MyStr End Sub 結果は同じですが、中身が違います。 今後コードを作っていく上で どちらの方式の方が良いのでしょうか?

  • 各変数に何文字格納できるのでしょうか?

    Dim myStr As Variant と Dim myStr As String では、 それぞれmyStrには何文字格納できるのでしょうか?

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

専門家に質問してみよう