• 締切済み

作成したいマクロがあります。。。

どなたか教えてください。 マクロで、ある作業を自動化したいです。 【内容】 ある文字列の括弧内のみを取り出したいです。 【パターン1】   列1                  列2           列3    ・・・ 1 A123(D234,E567,・・・) 【パターン2】   列1                  列2           列3    ・・・ 1 B456(G785,H652, 2 C789,i951,j753 3 F963,K852・・・) 上記のように1つのセル内に( )が存在したり、また行をまたいで( )が存在したりします。 ※列は一定です。 その括弧内の文字のみをセルに分けて下記のように表示したいです。  列1                  列2               列3   ・・・ 1 B456(G785,H652,         G785              H652 2 C789,i951,j753           C789              i951        j753 3 F963,K852・・・)           F963             K852 抜き出したい文字列についてですが、1桁から10桁くらいまであります。 たとえば U2,R965482 等 以上です。どなたか教えてください。

みんなの回答

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

#3で、「こちらにとしては、そういう規則性は無視したほうが簡単かもしれません。」 としていたので、#3の結果は当然かもしれません。 こういう質問は、途中でどんでん返しの内容が出てくるので、まず、標準的な内容で書いてみました。実務では、そう簡単でないことも多いものですが、実際、コードを書いて、人の反応をみないと、分からないからです。 '現在、括弧は、全角はないものとして作られています。もし、入り込む要素がある場合は、「誤動作を避けるために空白値を抜く」の次に、同じようなコードで置換しなければなりません。 ===== Sub Test1R()  Dim rng As Range  Dim buf As String  Dim Matches As Object  Dim Match As Object  Dim i As Long, j As Long  Dim a As Variant  Dim flg As Boolean  With CreateObject("VBScript.RegExp")   Set rng = Range("A1", Cells(Rows.Count, 1).End(xlUp))   Application.ScreenUpdating = False   For i = 1 To rng.Rows.Count    buf = rng.Cells(i, 1).Value    buf = Replace(buf, Space(1), "", , , 1) '誤動作を避けるために空白値を抜く    If InStr(1, buf, "(", 1) > 0 Then     flg = True     .Pattern = "\(([A-z\d,]+)"    Else     .Pattern = "([A-z\d,]+)"    End If    .Global = True    If flg Then     Set Matches = .Execute(StrConv(buf, vbNarrow))     If Matches.Count > 0 Then      a = Matches(0).SubMatches(0)      a = Split(a, ",")      Cells(i, 2).Resize(, UBound(a) + 1).Value = a     End If     j = 0    End If    If InStr(1, buf, ")", 1) > 0 Then     flg = False    End If   Next  End With  Application.ScreenUpdating = True  Set rng = Nothing End Sub

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

うーん、何か、規則性に疑問というか、たぶん、このオリジナルがあるだろうと思いますが。何かの加減で、改行されてしまったのでしょうね。だから、こちらにとしては、そういう規則性は無視したほうが簡単かもしれません。ただし、「抜き出したい文字列」の条件としては、アルファベットと数字に限ります。 '//標準モジュール Sub Test1()  Dim rng As Range  Dim Matches As Object  Dim Match As Object  Dim i As Long, j as Long  Dim a As Variant  With CreateObject("VBScript.RegExp")   Set rng = Range("A1", Cells(Rows.Count, 1).End(xlUp))   Application.ScreenUpdating = False   For i = 1 To rng.Rows.Count    If InStr(1, rng.Cells(i, 1).Value, "(", 1) > 0 Then     .Pattern = "\(([A-z\d,]+)"    Else     .Pattern = "([A-z\d,]+)"    End If    .Global = True    Set Matches = .Execute(StrConv(rng.Cells(i, 1).Value, vbNarrow))    If Matches.Count > 0 Then     a = Matches(0).SubMatches(0)     a = Split(a, ",")     Cells(i, 2).Resize(, UBound(a) + 1).Value = a    End If    j = 0   Next  End With  Application.ScreenUpdating = True  Set rng = Nothing End Sub こちらも試してみてください。 http://okwave.jp/qa/q6334623.html ・マクロで( )内を抜く方法について

tk01223
質問者

補足

補足します。 説明が下手で申し訳ないです。。 同列の括弧に囲まれていない箇所も表示させないようにしたいのです。 [現状のマクロでのOUTPUT] R1116,R1130,R4005,            R1116   R1130   R4005 R6006,R6037,R6041,            R6006   R6037   R6041 R7022,R7023(R208,R817,R1022,     R208   R817   R1022 R4007,R4018,R4019,R4020,R4021,R4022,     R4007   R4018   R4019 R5018,R7009は実行)            R5018   R7009 R1112,R1113,R1114,            R1112   R1113   R1114 R933,R1020,R1104,              R933   R1020   R1104 括弧内以外のものも表示されないようにしたい。。 R1116,R1130,R4005, ←OUTPUTなし R6006,R6037,R6041, ←OUTPUTなし R7022,R7023(R208,R817,R1022,            R208 R817 R1022 R4007,R4018,R4019,R4020,R4021,R4022,       R4007   R4018   R4019 R5018,R7009は実行)                  R5018   R7009 R1112,R1113,R1114,←OUTPUTなし R933,R1020,R1104, ←OUTPUTなし 以上、よろしくお願いします。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.2

どうも。 補足など読みましたが・・・・・ マクロ自体の作成方法がよく分からないというレベルなのでしょうか? ツールメニュー「マクロ」のマクロの記録など試してみましたか? もし本当の初心者で、マクロを学習したい、と言うのであれば、この場はあまりふさわしく無いと思われます。 サンプルを作れないことも無いですが、私なんかのへっぽこ解説よりも VBAに関する初心者向け解説やサンプル提示を行っている専門サイトを巡った方が宜しいのではないでしょうか? また、書店に行けば参考書もありますしねぇ。

tk01223
質問者

お礼

大変申し訳ありません。初心者でまだ初めて日が浅くこの場にはふさわしくなかったかもしれませんが、詳しい方に相談しなければ解決できそうになかったもので…。 ご意見とてもありがたく、今後も相談させて頂ければ助かります。 ありがとうごさいました。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

"("の左側はB列以降への出力対象ではないのですね? 例外的な状況として ・")"の右側に文字は存在し得るのか? ・"("および")"が複数存在する可能性はあるのか? という事が考えられそれぞれの場合の処理方法が不明ですが、そういった部分は後ほど考えてください。 考え方としては ・A列の対象文字列を変数に格納 ・変数内で"("と")"との存在を確認し、"("の左側と")"の右側を処理の対象からとりあえず外す ・変数内に残った文字列はすべて処理の対象で、xxx,yyy,zzzと言うような形式になっています。 さすれば、split関数を使って先の文字列を文字列変数配列に変換します。 後は、配列の個数を確認して、配列の各要素をB列以降へ貼り付けていく。 Split関数の詳細やセルへのデータ貼り付け方法はネットで探せばすぐに見つかります。

tk01223
質問者

お礼

ありがとうございます。ですがマクロ初心者でしてどう作ってよいかわかりません。(ヘルプも見てみたのですが…)もしよろしければ参考にマクロを組んで頂けるとありがたいです。 この問題に取り組んでから約1週間くらいになりますが今のレベルではサッパリです。 お礼内容にこんな事を書いてすいません。

tk01223
質問者

補足

補足します。 )の右側には存在しません。 また(( )) は存在しません。( )のみです。

関連するQ&A