• 締切済み

エクセルVBAでの文字列抽出とセルへの出力

エクセルVBAで文字列を検索して、検索した文字列を他のセルへ出力する方法を探しております。状況を図で説明すると、 A1セル:aaa\bbb\item1\ddd A2セル:aaa\bbb\ccc\item2\ddd A3セル:aaa\bbb\ccc\ddd\item3\eee このような状態からitemを検索して、B1セルに B1セル:item1 B2セル:item2 B3セル:item3 と表示させたいです。エクセルVBA初心者なものでRegExpを使うのかな、というところまではたどり着きましたが、そこから先にすすめません。 何か良い方法をご存知の方、教えていただきたいです。よろしくお願いいたします。

みんなの回答

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.4

色々やり方はあるとおもいます。 Split関数を使ってみました。 確かExcel2000以降、実装されているVBA関数です。 Sub test()   Dim v As Variant   Range("A1").Select   While ActiveCell <> ""     v = Split(ActiveCell.Value, "\")     ActiveCell.Offset(,1).Value = v(UBound(v) - 1)     ActiveCell.Offset(1).Select   Wend End Sub

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.3

VBScript.Regexp の機能は凄いですね。 簡単に以下の方法も・・・ Sub test()   Dim mRow      As Long   Dim wStr      As String   Dim i, j, k     As Integer   '   With ActiveSheet     For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row       wStr = .Cells(i, 1)       j = InStr(1, wStr, "item")       k = InStr(j, wStr, "\")       '       .Cells(i, 2) = Mid(wStr, j, k - j)     Next   End With End Sub

jaro001
質問者

お礼

無事できました。 Withを使ったりするのにまだ慣れてないですが、頑張って覚えていこうと思います。 本当にありがとうございました。

  • nebsoku
  • ベストアンサー率35% (65/185)
回答No.2

きたないコードになってしまったのですが・・・ 最後の\と最後から2番目の\の間の文字を抽出するコードを考えてみました。 もっときれいにできるはずなので、後はご自分でどうぞ^^; Dim Str As String Dim LastRow, Characters As Integer Dim i, j, Yen As Integer Dim Len1, Len2 As Integer Yen = 1 Range("A1").End(xlDown).Select LastRow = Selection.Row For i = 1 To LastRow Str = Cells(i, 1) Characters = Len(Cells(i, 1)) For j = Characters To 1 Step -1 If Mid(Str, j, 1) = "\" Then If Yen = 1 Then Len1 = j End If If Yen = 2 Then Len2 = j + 1 End If Yen = Yen + 1 End If Next j Yen = 1 Cells(i, 2) = Mid(Str, Len2, Len1 - Len2) Next i

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Sub test()  Dim v As Variant  Dim i As Integer  Dim Matches  Dim Match  v = Array("aaa\bbb\item1\ddd", "aaa\bbb\ccc\item2\ddd", "aaa\bbb\ccc\ddd\item3\eee")  With CreateObject("VBScript.Regexp")       .Pattern = "item\d*"       .Global = True       For i = 0 To 2           If .test(v(i)) Then              Set Matches = .Execute(v(i))              For Each Match In Matches                  MsgBox Match.Value              Next           End If       Next  End With End Sub この様な事でしょうか。

jaro001
質問者

お礼

このやり方でもいけますね。 皆様のおかげで本当に助かりました。 ありがとうございました。

関連するQ&A