文字列中のアンダーバーの前後の文字列を取得するには? (InStrRev関数の使い方)
Question 99.5 Excel VBA Borad (掲示板)より Previous Next
こんにちは。 また質問させていただきます。
ワークシート
左図のように、B列に記入してある文字列を F~H列のように振り分けたいのです。
この時、B列に入る文字列はランダムですが、アンダーバーで必ず区切るようになっています。
アンダーバーの数で F~H列の指定場所に振り分けるようにしたいのですが、1つのセル内にいくつアンダーバーがあるかを取得したいです。 宜しくお願い致します。
Answer   Copyright (C) 2010.1.27 永井善王
ご質問文と図がしっかりしているので、核心部分に InStr関数InStrRev関数を使ったマクロをご提供します。 これを参考にして組み上げてみて、上手くいかない場合は再質問してください。
Sub 文字列をアンダーパーの数に合わせてセパレートする()
    文字列 = Range("B2").Value
    前 = InStr(1, 文字列, "_", vbTextCompare)
    後 = InStrRev(文字列, "_", -1, vbTextCompare)
    If 前 = 後 Then
        MsgBox "_は1つだけです。"
        左 = Left(文字列, 前 - 1)
        右 = Right(文字列, Len(文字列) - 後)
    Else
        MsgBox 文字列 & " には_が2つあります。先頭から " & 前 & "文字目と" _
            & 後 & "文字目です。"
        左 = Left(文字列, 前 - 1)
        中 = Mid(文字列, 前 + 1, 後 - 前 - 1)
        右 = Right(文字列, Len(文字列) - 後)
    End If
End Sub
InStrRev関数の機能
検索対象となる文字列の中から、検索する文字列を最後の文字位置から検索し、最初に見つかった文字位置 (先頭からその位置までの文字数) を返す

InStrRev関数の構文
InStrRev(検索対象となる文字列式, 検索する文字列式 [.検索の開始位置] [, 比較モード])

InStrRev関数使用例
    文字列 = "BBBBB_CCCC_DDD"
    アンダーパー位置 = InStrRev(文字列, "_", -1, vbTextCompare)
InStrRev関数の引数compare(比較モード)の定数
定数 説明
vbUseCompareOption -1 Option Compareステートメントの設定を使用して比較を行う
vbBinaryCompare 0 バイナリモードの比較を行
vbTextCompare 1 テキストモードの比較を行う
vbDatabaseCompare 2 Microsoft Accessの場合のみ有効、データベースに格納されている設定に基づいて比較を行う
ありがとうございました
ありがとうございました。何とかできそうです。
アンダーバーが3つ以上になっても、前、後を位置1~最後のように取得していけばよさそうです。
位置1 = InStr(1, 文字列, "_", vbTextCompare)
位置2 = InStr(位置1 + 1, 文字列, "_", vbTextCompare)
位置3 = InStr(位置2 + 1, 文字列, "_", vbTextCompare)
 ・
 ・
最後 = InStr(文字列, "_", -1, vbTextCompare)
これでなんとかやってみようと思います。 また助けていただきまして、ありがとうございました。

 

Excel VBA Macro