- 締切済み
作成したいマクロがあります。。。
どなたか教えてください。 マクロで、ある作業を自動化したいです。 【内容】 ある文字列の括弧内のみを取り出したいです。 【パターン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 等 以上です。どなたか教えてください。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
#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)
うーん、何か、規則性に疑問というか、たぶん、このオリジナルがあるだろうと思いますが。何かの加減で、改行されてしまったのでしょうね。だから、こちらにとしては、そういう規則性は無視したほうが簡単かもしれません。ただし、「抜き出したい文字列」の条件としては、アルファベットと数字に限ります。 '//標準モジュール 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 ・マクロで( )内を抜く方法について
- trajaa
- ベストアンサー率22% (2662/11921)
どうも。 補足など読みましたが・・・・・ マクロ自体の作成方法がよく分からないというレベルなのでしょうか? ツールメニュー「マクロ」のマクロの記録など試してみましたか? もし本当の初心者で、マクロを学習したい、と言うのであれば、この場はあまりふさわしく無いと思われます。 サンプルを作れないことも無いですが、私なんかのへっぽこ解説よりも VBAに関する初心者向け解説やサンプル提示を行っている専門サイトを巡った方が宜しいのではないでしょうか? また、書店に行けば参考書もありますしねぇ。
お礼
大変申し訳ありません。初心者でまだ初めて日が浅くこの場にはふさわしくなかったかもしれませんが、詳しい方に相談しなければ解決できそうになかったもので…。 ご意見とてもありがたく、今後も相談させて頂ければ助かります。 ありがとうごさいました。
- trajaa
- ベストアンサー率22% (2662/11921)
"("の左側はB列以降への出力対象ではないのですね? 例外的な状況として ・")"の右側に文字は存在し得るのか? ・"("および")"が複数存在する可能性はあるのか? という事が考えられそれぞれの場合の処理方法が不明ですが、そういった部分は後ほど考えてください。 考え方としては ・A列の対象文字列を変数に格納 ・変数内で"("と")"との存在を確認し、"("の左側と")"の右側を処理の対象からとりあえず外す ・変数内に残った文字列はすべて処理の対象で、xxx,yyy,zzzと言うような形式になっています。 さすれば、split関数を使って先の文字列を文字列変数配列に変換します。 後は、配列の個数を確認して、配列の各要素をB列以降へ貼り付けていく。 Split関数の詳細やセルへのデータ貼り付け方法はネットで探せばすぐに見つかります。
お礼
ありがとうございます。ですがマクロ初心者でしてどう作ってよいかわかりません。(ヘルプも見てみたのですが…)もしよろしければ参考にマクロを組んで頂けるとありがたいです。 この問題に取り組んでから約1週間くらいになりますが今のレベルではサッパリです。 お礼内容にこんな事を書いてすいません。
補足
補足します。 )の右側には存在しません。 また(( )) は存在しません。( )のみです。
補足
補足します。 説明が下手で申し訳ないです。。 同列の括弧に囲まれていない箇所も表示させないようにしたいのです。 [現状のマクロでの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なし 以上、よろしくお願いします。