VBAで指定文字列を基準に文字列を抜き出す方法

このQ&Aのポイント
  • VBAを使用して指定文字列を基準に、文字列の一部を抜き出す方法について質問です。
  • 具体的には、指定文字列より左にある文字を削除したり、指定文字列より右にある文字を削除したり、指定文字列と指定文字列の間の文字列を抜き出したいと考えています。
  • 現在は配列を使用して行っているが、もっと効率的な方法があるかどうか教えて欲しいです。
回答を見る
  • ベストアンサー

VBA 指定文字列が出てきたら、左の文字は削除する

お世話になっております。 Excel2003を使用しております。 指定文字列が出てきたら、左にある文字は全て削除したいと思っております。 例) 番号:0001  名前: 佐藤 太郎   趣味:散歩 ↓「名前:より左は削除」 名前: 佐藤 太郎   趣味:散歩 また、出来たら指定文字列より右にあるものも削除できたら良いなと思っております。 例) 番号:0001  名前: 佐藤 太郎   趣味:散歩 ↓「趣味:より右は削除」 番号:0001  名前: 佐藤 太郎 色々試してみています。 今後もたくさんのプログラムに使っていくことも考え、配列に入れることも考えています。 LeftDeleteMoji=Array("名前:") RightDeleteMoji=Array("趣味:") やりたいこととしては、                 (例)番号:0001  名前: 佐藤 太郎   趣味:散歩 左から指定文字列手前まで抜き出す とか    (例)「名前:」 名前: 佐藤 太郎   趣味:散歩 右から指定文字列まで抜き出す とか       (例)「趣味:」 番号:0001  名前: 佐藤 太郎 指定文字列と指定文字列の間を抜き出す とか (例)「名前:,趣味:」名前: 佐藤 太郎 があります。 A列を上から順番に行っていき、 必要ない部分はスルーして、必要な部分のみ抜き出し、 別シートに書き込む。 これを行おうと思っています。 If InStr(.Range("A" & i).Value, NeedData(Num)) > 0 And Len(.Range("A" & i).Value) > 0 then で文字列が含まれているか確認していたのですが、 配列の設定方法なのか、色々良く分からなくなってしまいまいました。 -------------------------------現在のプログラム NeedData = Array("", "名前:", "名前:", "趣味:") For i = 1 To MaxRow '重要データ保存 If Num > UBound(NeedData) Then Num = 0 End If If InStr(.Range("A" & i).Value, NeedData(Num)) > 0 And Len(.Range("A" & i).Value) > 0 Then '含む場合の動作 If NeedData(Num) = "" Then If InStr(.Range("A" & i).Value, NeedData(Num + 1)) > 0 Then EndData = InStr(.Range("A" & i).Value, NeedData(Num + 1)) ThisWorkbook.Worksheets("回答連絡メール内容").Range("A" & TESTRow) = Left(.Range("A" & i).Value, EndData - 1) '左から指定文字が出てくるまで! Num = Num + 2 TESTRow = TESTRow + 1 End If Else StartData = InStr(.Range("A" & i).Value, NeedData(Num)) + Len(NeedData(Num)) EndData = InStr(.Range("A" & i).Value, NeedData(Num + 1)) ThisWorkbook.Worksheets("回答連絡メール内容").Range("A" & TESTRow) = Mid(.Range("A" & i).Value, StartData, EndData) '左から指定文字が出てくるまで! Num = Num + 2 TESTRow = TESTRow + 1 End If End If Next ーーーーーーーーーーー------------------- 入力されているデータ(元のデータ)は決まりごとがあり、 必ずその文字データはあります。(順番も合っています) 上記プログラムは、配列が空白だったら、配列の2個目を検索して 右にある必要の無いデータは削除する。 そのような流れにしようと思っていました。 話がそれましたが、もっと良い(分かりやすい)プログラム方法がある気がします。 現状、一応完成?というところまできては居ますが、 もし、失敗した場合、どこが原因がハッキリしない感じになってしまっています。 左から指定文字列手前まで抜き出す    (例)「名前:」 名前: 佐藤 太郎   趣味:散歩 右から指定文字列まで抜き出す       (例)「趣味:」 番号:0001  名前: 佐藤 太郎 指定文字列と指定文字列の間を抜き出す (例)「名前:,趣味:」名前: 佐藤 太郎 良い方法があれば教えて下さい! よろしくお願い致します!

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

  • ベストアンサー
  • eden3616
  • ベストアンサー率65% (267/405)
回答No.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

satoron666
質問者

お礼

回答頂きありがとうございます。 >この手の質問ではデータの入力様式が明確にわかるように参照画像があればよいのですが。 以後、気をつけていきます!ご指摘ありがとうございます! また、教えて頂いたプログラム、 やりたいことが思ったとおりに出来ました! ありがとうございます^^

関連するQ&A

  • (VBA)文字列を指定位置から抜き出す

    Office2019,Windows10 文字列の指定位置から文字列の最後までを抜き出すコード(文字列())を作成しました。 現在は、指定文字列位置を指定するのに目で数えて指定しますが  数え間違えが多いのでミスを少なくする方法を検討しました。 以前教えてもらったコード(Nubering3())が利用したいのですが、 イメージだけでどうしたらいいか分かりません。 イメージとしては、  1)range(A1)の文字列で添付画像のような画像を表示して、   画像の下部に「どこから? 数値を入力してください」と表示して   抜き出し開始位置の数値を入力する   添付画像のように文字数が多くなると行が長くなるので    40文字毎に改行されて表示させる    (改行が難しい場合は、それに代わる方法でもOKです。)  2)数値が入力されれば、最初の画像(のような)は消えて     B列に抜き出し結果が表示される。 ---------------------------------------------------------------- Sub Mid文字列() Dim MojiSuu As Single Dim KokoKara As Variant Dim I As Single Dim Nukidashi As String Dim EndRow As Single EndRow = Cells(1, "A").End(xlDown).Row KokoKara = Application.InputBox(prompt:="どこから? 数値を入力してください", Title:="数値入力", Type:=1) If TypeName(KokoKara) = "Boolean" Then MsgBox "数値以外が入力されたので終了します。" Exit Sub End If For I = 1 To EndRow MojiSuu = Len(Range("A" & I)) Nukidashi = Mid(Range("A" & I), KokoKara, MojiSuu) Range("B" & I) = L Next I End Sub --------------------------------------------------------------- Sub Nubering3() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long, WRow As Long Dim uRows As Range, uRange As Range Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") Set uRows = Ws2.Rows(1) Set uRange = Ws2.Range("A2") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row WRow = Ws2.Cells(Rows.Count, "A").End(xlUp).Row + 1 If Ws2.Range("A1").Value = "" And WRow = 2 Then WRow = 1 End If Set uRows = Union(uRows, Ws2.Rows(WRow)) For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(WRow, j).Value = j Ws2.Cells(WRow + 1, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, j)) Next Next i 'Numeling 大文字、中央揃え uRows.HorizontalAlignment = xlCenter uRows.Font.Bold = True '分割文字中央揃え罫線外枠 uRange.HorizontalAlignment = xlCenter uRange.Borders.LineStyle = xlContinuous 'セル幅を見やすく Ws2.Range("A1:xx100").ColumnWidth = 3 Application.ScreenUpdating = True Ws2.Activate Set Ws1 = Nothing Set Ws2 = Nothing Set uRows = Nothing Set uRange = Nothing End Sub

  • Excel VBAで文字列の部分一致の文字列を表示

    以前、こちらで頭5文字までの一致で文字列を表示するVBAを教えて頂きました。今回はFINDなどの部分一致での文字列を表示することをしたいのですが、ご教示いただけますと幸いです。 下記はSheet1のA3に文字を5文字以内いれるとSheet2のC列からピックアップしてSheet1のA列に文字列を表示する及びSheet2のB列のデータをSheet1のC列に表示させるVBAです。 Sub Test2() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim SData As String, i As Long, VRet As Variant Dim c As Range, LastRow As Long Set Ws1 = Sheets("Sheet1") Set Ws2 = Sheets("Sheet2") SData = CStr(Ws1.Range("A3").Value) If SData = "" Then Exit Sub i = 5 LastRow = Ws1.Cells(Rows.Count, "A").End(xlUp).Row If LastRow < i Then LastRow = i End If Ws1.Range(Ws1.Cells(i, "A"), Ws1.Cells(LastRow, "C")).ClearContents With Ws2 For Each c In .Range(.Cells(1, "C"), .Cells(Rows.Count, "C").End(xlUp)) VRet = InStr(1, CStr(c.Value), SData, vbTextCompare) If VRet = 1 And Len(c.Value) >= 10 Then Ws1.Cells(i, "A").Resize(1, 2).Value = c.Resize(1, 2).Value 'とりあえずSheet2のB列のデータ(C列のデータに同期したデータ)をSheet1のC列に Ws1.Cells(i, "C").Value = .Cells(c.Row, "B").Value i = i + 1 End If Next End With End Sub 宜しくお願い致します。

  • EXCEL VBA 文字列 

    下記のソースの場合、一つのセル(例えばA1)に【鈴木 太郎】とあれば、隣のセル(B1)に"鈴木 太郎"と表示されます。 (これを一つのセルに【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合は、"鈴木 太郎】【佐藤 太郎】【伊藤 太郎"と表示されます。) 例えば、C1には【鈴木 太郎】【佐藤 太郎】【伊藤 太郎】とあった場合には、C2には"鈴木 太郎"、D2に"佐藤 太郎"、E2に"伊藤 太郎"とすることは可能でしょうか? ※行によって異なり、【○○ ○○】はいくつあるとは限らないとします。 よろしくお願いいたします。 Sub PickupWords()  Dim Matches As Object  Dim Match As Object  Dim buf As String  Dim c As Variant  With CreateObject("VBScript.RegExp")   .Pattern = "【(.+)】"   .Global = False   Application.ScreenUpdating = False   For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp))    If .Test(c.Value) Then     buf = c.Value     Set Matches = .Execute(buf)    c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す    End If   Next c   Application.ScreenUpdating = True  End With End Sub

  • VBAで数値を文字列にして入力したい

    Range("A" & X).Value = Year(Date) Range("B" & X).Value = Right("0" & Month(Date), 2) このVBAでは セルの書式指定で文字列にしても 文字列の指定を外すと数値に戻ります。 でも、文字列の設定を外したら 数値に戻らないものもあり ピボットテーブルで集計した時に 同じ「2013」が2種類存在してしまいます。 どうしたらいいですか?

  • エクセルVBA 特定文字以外の行削除

    こんにちは。 先日以下のURLで質問させて頂きました者です。 http://okwave.jp/qa/q8567085.html そこで、教えて頂いたマクロは成功したのですが、 inputboxではない方法を知りたいです。 ---前回頂きました回答を引用しております------------------------------ retu = "D" word = InputBox(retu & "列に指定した文字が含まれていない行を削除します。" _ & vbCrLf & "検索する文字を入力してください。") For i = Range("D" & "65536").End(xlUp).Row To 2 Step -1 If InStr(1, Range(retu & i).Value, word) = 0 Then Rows(i).Delete End If Next i ------------------------------------------------------------------ この文の文字を入力せずに、 マクロの中に特定の文字を記入して、その文字列以外の行を削除したいです。 ご教授頂けたらと思います。 宜しくお願い致します。

  • VBA For Eachでセル内の文字列を一個ずつ取り出すには

    エクセル2000です。 たとえばA1セル内の文字列を一個ずつ取り出す場合、 Sub test01() For i = 1 To Len(Range("A1").Value) Cells(i, "B").Value = Range("A1").Characters(i, 1).Text Next End Sub このように最初から最後の文字まで何番目で指定することはわかるのですが、これをFor Each で回すにはどうしたらよいでしょうか? (⌒o⌒)? お教えください。 Sub test02() For Each ch In Range("A1").Characters i = i + 1 Cells(i, "B").Value = ch Next End Sub ではエラーになります。

  • 【VBA】 文字列の中から指定の文字列を取り出す

    VBAで文字列から指定の文字のn番目からn+1番目までの文字列を取り出すことは可能でしょうか? A1セルに下記の文字列があった場合、「1番目の半角スペースから2番目の半角スペースまでの文字列」を取り出したいのです。 5 53 00 8R この場合、53を取り出したいというわけです。 また、可能でしたら「最後の半角スペースから文字列の最後まで」を取り出す方法も教えていただけるとありがたいです。 この場合は8Rとなります。 InStr関数を使えばできるかもと思ったのですが、できそうなものが思い浮かびません。 どなたか教えていただけませんでしょうか。 よろしくお願いいたしますm(_ _)m

  • VBA 別のシートから文字列参照して全て表示

    ExcelのVBAでSheet1のA3に5文字の文字列(大文字、小文字を区別しない)を入力してSheet2のC列にあるA3の文字列から始まるデータ(10文字以上)をすべてを参照してSheet2のD列を含めSheet1のA5,B5から下にすべて表示させる。 宜しくお願い致します。 Sub macro1() Dim V2 As Variant V1 = Sheets("sheet1").Cell("A3").Value '文字列を取得 V2 = Application.InStr(Sheets("sheet2").Range("C:C"), V1) '検索するテーブルでC列の文字列を探す 'みつけたら、その行、無かったら、エラーのコードが変数に入る If IsError(V2) Then 'テーブルに無かったらなにもしない Else str0 = Worksheets("Sheet2").Cells(V2, 7).Value str1 = Worksheets("Sheet2").Cells(V2, 8).Value str2 = Worksheets("Sheet2").Cells(V2, 9).Value Worksheets("sheet1").Cells(i, 2).Value = str0 Worksheets("sheet1").Cells(i, 3).Value = str1 Worksheets("sheet1").Cells(i, 4).Value = str2 End If End Sub

  • 指定した文字列が含まれる行を削除する

    データの照合をしています。 指定した文字列が、「O列」に入っていたら、その行を削除し、 行をつめる というようなマクロを組みたいのですが、エラーがかかってしまいます。 (下のVBは、ネットで公開されていたのを使用させていただいております。) Sub Macro1() Const col As String = "A" '文字列が入力されている列 Dim idx As Long Dim keyWord keyWord = Application.InputBox("削除対象の文字列は?", Type:=2) If TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 Then   For idx = Cells(65536, col).End(xlUp).Row To 1 Step -1     If InStr(Cells(idx, col).Value, keyWord) > 0 Then '    If Application.CountIf(Rows(idx), "*" & keyWord & "*") > 0 Then       Rows(idx).Delete     End If   Next idx End If End Sub 「下から3行目のNEXTに対応するforがない」とエラーがでます。 ご教授、お願いいたします。

  • VBA エクセル 文字列

    A列に、【鈴木 太郎】、【佐藤 一郎】・・・・と続いていて、B列には鈴木、佐藤・・・と表示させたい場合は以下のソースに、 =LEFT(A1,FIND(" ",SUBSTITUTE(A1," "," "))-1) と同じソースを書けばいいのはわかるのですが、勉強不足でわかりません。教えていただけませんでしょうか。下記のソースも教えていただきました。すごく助かります。 Sub PickupWords() Dim Matches As Object Dim Match As Object Dim buf As String Dim c As Variant With CreateObject("VBScript.RegExp") .Pattern = "【(.+)】" .Global = False Application.ScreenUpdating = False For Each c In Range("A1", Cells(Rows.Count, 1).End(xlUp)) If .Test(c.Value) Then buf = c.Value Set Matches = .Execute(buf) c.Offset(, 1).Value = Matches.Item(0).SubMatches(0) '括弧の中を取り出す End If Next c Application.ScreenUpdating = True End With End Sub

専門家に質問してみよう