- ベストアンサー
VBAで指定文字列を基準に文字列を抜き出す方法
- VBAを使用して指定文字列を基準に、文字列の一部を抜き出す方法について質問です。
- 具体的には、指定文字列より左にある文字を削除したり、指定文字列より右にある文字を削除したり、指定文字列と指定文字列の間の文字列を抜き出したいと考えています。
- 現在は配列を使用して行っているが、もっと効率的な方法があるかどうか教えて欲しいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
いまいち様式がはっきりしません。 この手の質問ではデータの入力様式が明確にわかるように参照画像があればよいのですが。 行いたいことと異なっていればすいません。 ご提示のコードを一部読んで(全部読んでません)適当に解釈しました。 結果をどうするのかわからなかったのでとりあえず別セルに書き出しています。 (画像でいうところのC列となります) A列に複数行「番号:○○名前:○○趣味:○○」という様式で入っているデータがあり 指定した箇所を削除したいと解釈しています。 削除する方法ではなく、指定した部分を取り出す方法に勝手に変えてますが。 「action」マクロ実行後、入力ボックスが表示され範囲指定を促されます。 取り出したい範囲を「1~3」の数値で指定してください。 「1-2」、「1-3」や「-3」、「1-」のような範囲指定も可能です。 注) エラー処理は入れていません。 対象シートは現在アクティブになっているシートを対象にしています。 ■VBAコード Sub action() Dim word As String Dim inp As String Dim chk_inp As Variant Dim i As Long, j As Integer Dim key As Variant Dim ans(2) As String Dim a As Integer, b As Integer Dim ans_word(2) As Variant '分割キーの設定 key = Array("番号", "名前", "趣味") '範囲入力 inp = InputBox( _ prompt:=key(0) & "=1 / " & key(1) & "=2 / " & key(2) & "=3" & vbCrLf & _ "として範囲を以下の様式で指定してください。" & vbCrLf & vbCrLf & _ " n:n番の項目のみ取り出す場合" & vbCrLf & _ "n-m:nからm番の項目を取り出す場合" & vbCrLf & _ " -n:n番までの項目を取り出す場合" & vbCrLf & _ " n-:n番からの項目を取り出す場合" & vbCrLf _ , Title:="範囲指定") If inp = "" Then Exit Sub chk_inp = Split(inp, "-") '行数繰り返し処理 For i = 1 To Range("A" & Rows.Count).End(xlUp).Row '値を格納 word = Range("A" & i).Value '値を配列に分割 'キーで検索 a = InStr(1, word, key(1)) b = InStr(1, word, key(2)) '分割値を格納 ans_word(0) = Left(word, a - 1) '番号を格納 ans_word(1) = Mid(word, a, b - a) '名前を格納 ans_word(2) = Right(word, Len(word) - b + 1) '趣味を格納 word = "" '単発かどうかの判定 If UBound(chk_inp) = 0 Then '単発抜出の場合 word = ans_word(Int(chk_inp(0)) - 1) Else '範囲抜出の場合 If chk_inp(0) <> "" And chk_inp(1) <> "" Then '「n-m」を指定した場合 For j = Int(chk_inp(0)) To Int(chk_inp(1)) word = word & ans_word(j - 1) Next j Else '「-n」を指定した場合 If chk_inp(0) = "" Then For j = 1 To Int(chk_inp(1)) word = word & ans_word(j - 1) Next j End If '「n-」を指定した場合 If chk_inp(1) = "" Then For j = Int(chk_inp(0)) To 3 word = word & ans_word(j - 1) Next j End If End If End If '結果出力 Range("C" & i).Value = word Next i End Sub
お礼
回答頂きありがとうございます。 >この手の質問ではデータの入力様式が明確にわかるように参照画像があればよいのですが。 以後、気をつけていきます!ご指摘ありがとうございます! また、教えて頂いたプログラム、 やりたいことが思ったとおりに出来ました! ありがとうございます^^