• 締切済み

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

どなたか教えてください。 マクロで、ある作業を自動化したいです。 【内容】 ある文字列の括弧内のみを取り出したいです。 【パターン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

  • マクロ作成について

    今、時刻表と合致するセルに色を付けてソートするマクロを作っています。 次のようになっています。(停留所が3つの場合)   A  B  C   D   E   F   G   H   I   J   K   L  1 2 a  0  1059 1145 1858 3 b  1  1030 1100 1130 1146 1510 1859 4 c  2  1000 1031 1101 1131 1147 1412 1511 1900 5  A列のa、b、cはそれぞれバス停名です。C2~J4に書いてある数字はそれぞれのバス停の発車時刻になります。 また、B列の数字はバス停名aを起点としてb、cのバス停までの所要時間です。B列に関してはユーザーの方で入力。以上を踏まえまして、今回実装したいことは、 (1)C2から範囲選択をして色を付け、選択した範囲とB列に入力した数字を足して、それと合致したセルに色を付ける。   A  B  C   D   E   F   G   H   I   J   K   L  1 2 a  0  1059 1145 1858 3 b  1  1030 1100 1130 1146 1510 1859 4 c  2  1000 1031 1101 1131 1147 1412 1511 1900 5 これを行うとセルC2~E2とD3、F3、H3、E4、G4、J4には色が付くことになります。 (2)(1)で色の付いたセルのみをソート(色の付いていない部分は後ろのセルへ移動)   A  B  C   D   E   F   G   H   I   J   K   L  1 2 a  0  1059 1145 1858 3 b  1  1100 1146 1859 1030 1130 1859 4 c  2  1101 1147 1900 1000 1031 1131 1412 1511 5  以上になります。これを実装するためのコードを教えては頂けないでしょうか?よろしくお願いいたします。

  • エクセルのマクロ記述について

    下記の処理をエクセルのマクロで行いたいのですが、どのように記述したよいか教えてください。 4行目から入力されている行まで下記の処理をマクロで行う。 1.J列のセル入力がCIRCLEの行で、B~E列の数値が同じセル間を結合する。 2.K列のセル入力がCIRCLEの行で、F~I列の数値が同じセル間を結合する。 3.J列のセル入力がOBLONG_XまたはOBLONG_Yの行で、B,D列及びC,E列の数値が同じ場合、B列をB列の数値XC列の数値とし、B~E列のセルを結合する。 4.K列のセル入力がOBLONG_XまたはOBLONG_Yの行で、F,G列及びH,I列の数値が同じ場合、F列をF列の数値XG列の数値とし、F~I列のセルを結合する。 5.J列のセル入力がOBLONG_XまたはOBLONG_Yの行で、B,D列及びC,E列の数値が同じでない場合、B列をB列の数値XC列の数値とし、B,C列のセルを結合する。又、D列をD列の数値XE列の数値とし、D,E列のセルを結合する。 6.K列のセル入力がOBLONG_XまたはOBLONG_Yの行で、F,G列及びH,I列の数値が同じでない場合、F列をF列の数値XG列の数値とし、F,G列のセルを結合する。又、H列をH列の数値XI列の数値とし、H,I列のセルを結合する。 7.J列のセル入力がSHAPEの行で、B~E列は何もしない 8.K列のセル入力がSHAPEの行で、F~I列は何もしない

  • エクセル マクロでセルを自動移動

    例1のようになっているエクセル表があります。 データは右方向、下方向へ増えます。 Cの列以降は4つ単位でしかデータは増えません。 それを例2の表のように列A,Bのデータはそのままに Cの列以降の4つのセルを区切りに下の行に移動して、 空白の列まで言ったらA2の行以降を最後の行まで繰り返しするという マクロを書くことは可能でしょうか。 出来ましたらそのマクロを教えてください。 例1 A1 B1 C1 D1 E1 F1 G1 H1 I1 J1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 G3 H3 I3 J3 K3 L3 M3 N3 例2 A1 B1 C1 D1 E1 F1 A1 B1 G1 H1 I1 J1 A1 B1 K1 L1 M1 N1 A2 B2 C2 D2 E2 F2 A2 B2 G2 H2 I2 J2 A3 B3 C3 D3 E3 F3 A3 B3 G3 H3 I3 J3 A3 B3 K3 L3 M3 N3

  • Excel 2007のマクロ記述について

    Excel 2007で、B4セルからI最終行までの整数のみを小数点以下1桁にする処理をマクロで実行したいのですが、どのように記述したらよいか教えてください。 最終行とはI列にセルの値がある最後の行です。 下記の例のマクロ実行結果は、1→1.0、2→2.0となります。 (例)      列      A  B    C    D    E   F  G   H  I    J      K  行4  A1 0.9   0.9   0.9   0.9  1.2  1.2   2  2   CIRCLE  CIRCLE    5  A2 1.4   1.4   1.6   1.6   1   1  1.5  1.5  CIRCLE  CIRCLE    6  A3 0.71  0.71   0.71  0.71  1   1  1.5  1.5  CIRCLE  CIRCLE マクロ実行結果      列      A  B    C    D    E   F  G   H   I    J      K  行4  A1 0.9   0.9   0.9   0.9  1.2  1.2  2.0  2.0  CIRCLE  CIRCLE    5  A2 1.4   1.4   1.6   1.6  1.0  1.0  1.5  1.5  CIRCLE  CIRCLE    6  A3 0.71  0.71   0.71  0.71  1.0  1.0  1.5  1.5  CIRCLE  CIRCLE

  • Excelで飛び飛びのセル(列)を参照したいのですが…その2

     ある「sheet1」で、G1="A",H1="B",I1="C",J1="D",K1="E",L1="F",M1="G",N1="H",O1="I",P1="J",Q1="K",・・というように文字が入力されているとすると、5列飛びの値A,F,K・・・(G1,L1,Q1・・・)が欲しいのです。そして、その値が「sheet2」に、C5=A,D5=F,E5=K,F5=P・・・となるようにしたいのです。ただ数値が5ずつ増加するのではなく、そのセルに入力されている文字列を参照したいのです。  それをまた、「sheet1」の、G2="A",H2="B",I2="C",J2="D"・・・の値でも同じ事をしたいのですが・・・。  よろしくお願いします。

  • エクセル数式について

    A1のセルに¥123,456,789 9桁の数値があり、 B1~K1のセルに左から順に(下記の通り)表示したいのですが、 どのような方法がありますか? B1→\ C1→1 D1→2 E1→3 F1→4  G1→5 H1→6 I1→7 J1→8 K1→9

  • エクセル計算式

       A    B    C    D    E    F   G   H   I   J    K    L  1 名前(1) 80.00  50.0  51.0 ×54.0 80.0  85.0  90.0  51.0   90.0  141.0  2 2 名前(2) 79.00  50.0 ×52.0 ×53.0  88.0 89.0 91.0 50.0  91.0 141.0 1 このとき、      C~EのMAXをIに(×の場合は00.0で計算)      F~HのMAXをJに(×の場合は00.0で計算)      (※C~Hの前には×を入れるためのセルあり)      I,J,K共にBの数値が小さいほうが上位に来る      (※I,Jの後ろには、順位を入れるセルあり)      Kは、I+J      Lは、Kの計に対する順位       列がずれていて見にくいです。すみません。 どなたか回答お願いします。

  • エクセルデータの並び替え

    A列に 1 2 3 4 5 6 7 ・・・・・ B列に a b c d e f g h i j k l ・・・・ と文字列があります。 これを C列に 5つずつデータをセットにして並べたいのです。 A列    B列           C列 1     a      1 a   2 b  3 c  4 d  5 e 2     b      6 f   7 g  8 h  9 i  10 j 3     c      11 k  12 l  13 m  14 n  15 o 4     d      16 p   17 q  18 r  19 s  20 t 5     e      以下同じように続く 6     f 7     g 8     h 9     i 10     j 11     k 実際のC列のデータは トマト tomato  ネコ cat   机 desk  いす chair  かばん  bag  のようにしたいのです。 関数の扱いがわからずに苦戦しています。どうぞ、よろしくお願いします。

  • エクセルのマクロ記述について

    J列、K列に入力されている行まで下記処理を行うマクロの記述を教えてください。 J列のセルの文字列がにSHAPEの場合、その行のB~E列のセルの色を黄色にする。 K列のセルの文字列がにSHAPEの場合、その行のF~I列のセルの色を黄色にする。

  • Excelマクロ作成について

    今作成中のマクロがありまして   A  B C D E F G H I J K L M N O   ------------------------------------------------------------ 5 |     整理券   6 |      NO な 1 2 3 4 5 6 7 8 7 |  1 ○ な 17              8 |  2 △     17           9 |  3 × 1                 10|  4 □   21 19 17             11|  5 ▲ 2                 12|  6     25 21 19 17             13|  7 14|  8     29 24 21 19           15|  9   3                 16|  10 となっているエクセルシートなんですが、補足させていただきますと、Aの列は空白。Bの列はバスが停車する順番。Cの列にはバス停の名前。Dの列は整理券の出る番号です(「な」と書いてあるのはなしという意味です)。同様にE6から右も整理券の出る番号になっています。 E7から列ごとにズラーっと書いてあるのがバスの運賃です。 実装したいのは、 (1)整理券NOをD7から下に一つずつ走査していって、もし、そのセルが空白だったら一つ上のセルをコピーして貼り付ける。何か数字またはが入力されていたらスルーする。 ということを終着バス停まで行う。 (2)(1)で出来た整理券NOとE6以降の整理券NOが対応する運賃をコピーしてE列に挿入し貼り付け、2番目のバス停はF列に対応する整理券NOの運賃表を張り付ける。3番目以降は同様にG、H、I、J列…とずらして貼り付けます。 という作業を(1)と同様に終着バス停の整理券NOまで行う。 というものなのですが、どうコードを書いたら良いのか初心者のため分かりません。丸投げで失礼だとは思いますが、コードをご教授いただけたらなと思います。 よろしくお願い致します。