- ベストアンサー
【エクセル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 やはり、区切る文字が複数ある場合は不可能でしょうか? ご教授よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
一例ですが正規表現を用いてます。 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 ご参考になれば。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
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 になってますが、対象セル範囲や行列全体などで置換範囲を限定できます。データに実情に合わせて修正してください。
お礼
おお!なるほど! これは理解できました! こんなこともできるのですね! ありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 正規表現パターンは、複雑な内容でも修正が簡単なので確かに便利ですが、今回のような単純な内容の場合は、以下のような方法も覚えておくと、役に立つはずです。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 正規表現の構文
お礼
おお!これもできました! 皆さんすごいですね! とても参考になりました。 ありがとうございます。
- maron--5
- ベストアンサー率36% (321/877)
- n-jun
- ベストアンサー率33% (959/2873)
n-junです。 >VBScript関連でしょうか? そうですね。 私の中では正規表現は利用頻度が高いです。 >"\(\d+\)" 半角の( と 半角の)に囲まれた半角数値1回以上 を順次","に置換し、その後","で区切ってます ⇒ ar = Split(myReg.Replace(myStr, ","), ",")
お礼
なるほど~ 正規表現についてよく調べてみます。 お忙しい中ありがとうございます!!! 本当に助かりました!
お礼
まさか!!! だめもとで質問してみたのですが、できました!! すごいです!びっくりです! ありがとうございます。 ちなみに「 "\(\d+\)"」はどういう意味なのでしょうか? VBScript関連でしょうか?