• ベストアンサー

【エクセルvba】(1)(2)(3)を区切りとして分けたい 配列

こんばんは。 もしエクセルで可能なら教えていただきたいです。(2003です) A1セルに (1)りんご(2)みかん(3)バナナ と入力されています。 これを A2にりんご、B2にみかん、C2にバナナ とSplitと使って区切りたいのですが不可能でしょうか? 以下がここのサイトを参考にして作ったサンプルマクロです。 Sub サンプル() Dim myStr As String Dim ar As Variant myStr = Cells(1, 1) ar = Split(myStr, "") '←この部分をどうすればいいのかわからない Cells(2, 1).Resize(1, UBound(ar) + 1).Value = ar End Sub やはり、区切る文字が複数ある場合は不可能でしょうか? ご教授よろしくお願いします。

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

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

一例ですが正規表現を用いてます。 Sub try()  Dim myReg As Object  Dim myStr As String  Dim ar As Variant  Set myReg = CreateObject("VBScript.Regexp")  myReg.Pattern = "\(\d+\)"  myReg.Global = True  myStr = Cells(1, 1).Value  If myReg.Test(myStr) = False Then Exit Sub  ar = Split(myReg.Replace(myStr, ","), ",")  Cells(2, 1).Resize(1, UBound(ar) + 1).Value = ar  Set myReg = Nothing End Sub ご参考になれば。

5tgbhy
質問者

お礼

まさか!!! だめもとで質問してみたのですが、できました!! すごいです!びっくりです! ありがとうございます。 ちなみに「 "\(\d+\)"」はどういう意味なのでしょうか? VBScript関連でしょうか?

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

VBAにない正規表現(FSOにあるが)を避けて、何とか他の方法は無いかと考えた。 エクセルの置換で (*)(*はワイルドカード的意味での*)-->/(何でもよい。りんごなど品名には出て来そうに無い文字) に置換 後は普通のSplit関数の応用 最初の/が空白のデータを返すので For i = 1 To UBound(y)で、0からで無く1より以後を取り、0の分を捨てた。 前半は検索操作のマクロの記録を使った。 ーーーー Sub test01() Cells.Replace What:="(*)", Replacement:="/", LookAt:=xlPart, SearchOrder _ :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False '--- i = 1 x = Cells(i, "A") y = Split(x, "/") For i = 1 To UBound(y) MsgBox y(i) Next End Sub ーー Cells.Replace になってますが、対象セル範囲や行列全体などで置換範囲を限定できます。データに実情に合わせて修正してください。

5tgbhy
質問者

お礼

おお!なるほど! これは理解できました! こんなこともできるのですね! ありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 正規表現パターンは、複雑な内容でも修正が簡単なので確かに便利ですが、今回のような単純な内容の場合は、以下のような方法も覚えておくと、役に立つはずです。VBAでは、私は、小規模のものに対しては、正規表現を使いますが、大規模ではあまり使いません。勉強をするなら、別途、パターンの専門書で勉強しないと、分からない部分があります。 >(1)りんご(2)みかん(3)バナナ (括弧に全角を混ぜても可能です。) Sub Test1()   Dim txt As String   Dim i As Long, j As Long   Dim ar() As String   Dim k As Long   txt = Cells(1, 1).Value   i = 1   Do     i = InStr(i, txt, ")", 1)     j = InStr(i + 1, txt, "(", 1)     ReDim Preserve ar(k)     If j > 0 Then       ar(k) = Trim(Mid(txt, i + 1, j - i - 1))       k = k + 1     Else       ar(k) = Trim(Mid(txt, i + 1))     End If     i = j + 1   Loop Until (i = 0 Or j = 0)      Cells(2, 1).Resize(, UBound(ar()) + 1).Value = ar() End Sub http://msdn.microsoft.com/ja-jp/library/ae5bf541.aspx 正規表現の構文

5tgbhy
質問者

お礼

おお!これもできました! 皆さんすごいですね! とても参考になりました。 ありがとうございます。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.3

◆参考までに関数のよる方法です A2=TRIM(MID(SUBSTITUTE(SUBSTITUTE(A$1,"(",REPT(" ",100)),")",REPT(" ",100)),ROW(A1)*200,100)) ★下にコピー

5tgbhy
質問者

お礼

おお! 関数でも再現できました! ありがとうございます。

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

n-junです。 >VBScript関連でしょうか? そうですね。 私の中では正規表現は利用頻度が高いです。 >"\(\d+\)" 半角の( と 半角の)に囲まれた半角数値1回以上 を順次","に置換し、その後","で区切ってます ⇒ ar = Split(myReg.Replace(myStr, ","), ",")

5tgbhy
質問者

お礼

なるほど~ 正規表現についてよく調べてみます。 お忙しい中ありがとうございます!!! 本当に助かりました!