• ベストアンサー

Excelのマクロで()内の文字を抽出して書き出したい

HTMLにあるテーブルの部分をコピペして貼り付けたExcelファイルがあります。 A~Cまでの3列が埋まっている状態で、D以降の列は空欄です。 C列に123(1112)というように、数字(数字)の記載になっている部分があります。 ()の前と、中は必ず半角数字で、桁は1桁~5桁までと幅広い状態です。 この()内の数値をD~F欄に書き出したいです(縦3列のものを、横3列として書き出したい) 数字(数字)という記載のセルは、必ず縦に3つ並んでいますが C列は膨大なセル数なうえに、数字(数字)という記述以外のセルも間に入っております(数字のみのセルか、空欄のセルです) 3つ並んでいる部分のみを探して、()内の数値を抽出し、D~F列に書き出すことは可能でしょうか? 書き出す場所は、3つ並んでいるC列の最初のセルの横のD~Fだと助かります。 (数字(数字)がC6~8にあった場合、D6~F6に書き出される) なお、数字(数字)というセルはC列以外にはなく、4つ以上縦に並ぶ事もありません。 さすがにこのような内容を実行するのは不可能でしょうか? もし可能でしたら、マクロを組んでいただきたいです・・・よろしくお願いします。

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

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

ANo.3です。 Sub try2()  Dim RegExp As Object  Dim r As Range, rr As Range  Dim i As Integer, st As String  Set RegExp = CreateObject("VBscript.Regexp")  RegExp.Pattern = "\d+(\d*)"  For Each r In Range("C1", Cells(Rows.Count, 3).End(xlUp)).SpecialCells(xlTextValues).Areas      i = 1      For Each rr In r          If RegExp.Test(rr.Value) Then             st = RegExp.Replace(rr.Value, "$1")             st = Replace(Replace(st, "(", ""), ")", "")             r.Item(1).Offset(, i).Value = st             i = i + 1          End If      Next  Next  Set RegExp = Nothing End Sub こんな感じでしょうか。

tricktrick
質問者

補足

こちらの回答を見逃しておりました。すみません。 このマクロで無事横に書き出す事、C列をD列に変更した場合でも 書き出す事ができるようになりました。ありがとうございました。

その他の回答 (5)

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

横からで申し訳ないですが。 >今回はC列のものをD~Fに書き出すやり方を教えていただきましたが >1列ずらして、D列のものをE~Gに書き出す場合は >どのように変更したら良いのでしょうか? 参照している列と書き出している列の関係について、まず提示されたコードを理解する事が先では。 上記の件については、さほど難しいものではないはずです。 でないと今後のためにもならないと思いますけど。

tricktrick
質問者

補足

ご指摘ありがとうございます。 n-junさんが書いてくださったマクロにはC1とあって 列の指定が分かりやすかったのですが C列を記載している部分を見つける事ができなかった為につい聞いてしまいました。 参照している列の部分を探してみます。

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

#2です。 #3の補足に書かれている内容が、私のマクロで出来るはずですが、出来ないようでしたら、これ以上は、初歩的な問題のはずですから、こちらからは何も言うことはありません。

tricktrick
質問者

補足

週末忙しく、連絡が遅れてしまいました、申し訳ございません。 何度か試してみたところ、問題なく動作しました。 希望通りの動きで、大変感謝しております。 もう一つ質問で申し訳ないのですが 今回はC列のものをD~Fに書き出すやり方を教えていただきましたが 1列ずらして、D列のものをE~Gに書き出す場合は どのように変更したら良いのでしょうか? 大変お手数おかけしますが、再度ご返答よろしくお願いいたします。

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

ANo.1です。 >Microsoft Excel2002で下記の手順で試しましたが、 >何の変化もありませんでした。間違いがありましたらご指摘ください。 当方もExcel2002ですし、やり方は間違っていないと思います。 シートも特定をしていないので、データのあるシートがアクティブな状態であれば問題ないです。 ただ提示されたC列(?)のデータ形式に違いがないかどうか、或いはHTMLからコピペしたデータが、 A~C列にきちんと区切られて入っているのかどうか (見た目はC列にあっても実際にはA列にあるとか)を再確認されては?

tricktrick
質問者

補足

申し訳ございません、説明不足だったようです。 >>数字(数字)というセルはC列以外にはなく、4つ以上縦に並ぶ事もありません。 この部分なのですが、必ず3つ単位でセルが並んでいるという意味ではなく下記のような状態となります。 数字と()は全て半角、漢字が入力されているセルもあります。 C1 123(123) C2 100(90) C3 100(150) C4 123456 C5 空欄 C6 200(1500) C7 500(10000) C8 1000(1500) C9 空欄 C10 文字 試してみたところ、C列に3つ単位でセルが並んでいる部分は マクロを実行することでD~Fに書き出されました。 説明不足で申し訳ございません。 上のようなC列状態でも、D~Fに書き出す事は可能なのでしょうか? C列にある数字(数字)の部分の()内数値のみをD列に書き出し D列に3つずつ並んでいる数値をE~Gに横に書き出す…といったような形式になってもかまいません。 大変お手数おかけしますが、よろしくお願いします。

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

こんばんは。 すでに回答が出ていますが、こういう質問の時は、具体例を示してください。言葉の説明だけでは行き違いがあるかもしれません。ですから、こちらの想像の範囲だけです。 #1さんとは大きな解釈の違いはありませんが、 >123(1112)というように、数字(数字)の記載になっている部分があります。 ()の前と、中は必ず半角数字で、桁は1桁~5桁まで この部分を限定させていただきました。しかし、( ) は、半角という限定です。 なお、ワイルドカードは、 * は、直前の文字の数が、0~です。 + は、直前の文字の数が、1~です。 '標準モジュール Sub Test1()   Dim objReg As Object   Dim i As Integer   Dim j As Long   Dim buf As String   Set objReg = CreateObject("VBscript.RegExp")      With objReg     '括弧内は、1桁~5桁まで     .Pattern = "\d+\((\d{1,5})\)"     .Global = False     Application.ScreenUpdating = False     For i = 1 To Cells(Rows.Count, 3).End(xlUp).Row       '3列並んでいるときのみ       If Application.CountA(Cells(i, 3).Resize(3)) = 3 Then         For j = 0 To 2           buf = Cells(i, 3).Offset(j).Value           If .Test(buf) Then             Cells(i, 3).Offset(, j + 1).Value = .Execute(buf)(0).SubMatches(0)           End If         Next j         i = i + j       End If     Next i     Application.ScreenUpdating = True   End With      Set objReg = Nothing End Sub

tricktrick
質問者

補足

ありがとうございます。 ANo.1さんへの補足でも書いたのですが 同じくこちらもSub Test1()~End Subまでをコピーし Test1を実行したのですが、なにも変化がありませんでした… 具体例といいますと、どこかにExcelシートをアップロードして ここにURLを貼り付ければよいということでしょうか?

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

Sub try()  Dim RegExp As Object  Dim r As Range, rr As Range  Dim i As Integer, st As String  Set RegExp = CreateObject("VBscript.Regexp")  RegExp.Pattern = "\d*(\d*)"  For Each r In Range("C1", Cells(Rows.Count, 3).End(xlUp)).SpecialCells(xlTextValues).Areas      If r.Rows.Count = 3 Then         i = 1         For Each rr In r             st = RegExp.Replace(rr.Value, "$1")             st = Replace(Replace(st, "(", ""), ")", "")             r.Item(1).Offset(, i).Value = st             i = i + 1         Next      End If  Next  Set RegExp = Nothing End Sub 質問を取り違えていたらごめんなさい。

tricktrick
質問者

補足

どうもありがとうございます。 Microsoft Excel2002で下記の手順で試しましたが、 何の変化もありませんでした。間違いがありましたらご指摘ください。 Excelを起動し、Bookを開く Alt+F11でMicrosoft Visual Basicを開く Module1に、上記の Sub try()~End Subをコピペする Bookの画面に戻りAlt+F8でtryを実行する この手順でやってみたのですが、なにもおこりませんでした。 やり方を間違っているのでしょうか? それとも、Excelのバージョンが古いせいでしょうか。

関連するQ&A

  • EXCELのデータ抽出

    縦x横x奥行の寸法データが記載されたデータが取引先からEXCELで届きます。 1300x500x10 や 500x500x100という表記です。 これらの寸法データはワンオフ品のため毎回4桁~2桁の数値で異なります。 縦、横、奥行のデータを下記のようにそれぞれ別のセルに抽出したいと思い いろいろ調べてみたのですがいい方法が見当たりません。 なにか方法はあるでしょうか? ご教示お願いします。 A列 1300x500x10  A列   B列   C列 1300   500   10

  • Excelで抽出、書き出しを繰り返すマクロ

    ExcelのD列に下記のように記載されたExcelの表があります D1 20(150) D2 300(100) D3 40(60) D4 月 10 / 火 15 / 水 200 / 木 50 / 金 52 / 土 20 / 日 100 / D5 空欄 D6 全角文字 D7 半角数字 D8 10(50) D9 200(200) D10 30(90) D11 月 30 / 火 18 / 水 100 / 木 150 / 金 352 / 土 120 / 日 150 / D12 全角文字 ・ ・ ・ これを、下記のように横一列に書き出したいです E1=20,F1=300,G1=40 (D1~D3の()の左側の数値) H1=150,I1=100,J1=60 (D1~D3の()の中の数値) K1=10,L1=15,M1=200,N1=50,O1=52,P1=20,Q1=100 (D4の曜日と/の間の数値) D1~D3(D8~D10)は全て半角です D4(D11)は曜日以外のスペースや数字、/は全て半角です D5~D7のようなセルが何個か間に入りますが(上の例では3個ですが、4個だったり5個だったりランダムです) D1~D4と同じ書式のセルが何度もでてきます。 その都度、横の欄に書き出せればと思っています。 (D8~D11のように同じ書式が出てきた場合はE8~Q8に書き出す形) 上手く説明できなくて申し訳ないのですが この作業を繰り返してくれるマクロを作成していただく事は可能でしょうか? 色々と指定が多いので、不可能でしょうか… もし可能なようでしたら、大変ご面倒おかけしますが 作成していただけますと助かります。よろしくお願いします。

  • エクセルのセル内数字の分割転記

    またしてもド素人の質問で恐縮ですが、 ある列に桁数の異なる数値が縦に並んで記載されているとき、 セルと同一列の別のセルに、数値を一文字ずつ分割して、下記の様に表示させたいのです。 (G列の数字はすべて右揃えのつもりです)   A B C D E F G 1  5 4 3 2 1   54321 2      1 2 3    123 3        2 2     22 4      6 5 2    652 5          9     9 そこで、A1には、=LEFT(RIGHT($G1,5))、B1には=LEFT(RIGHT($G1,4))、というように、関数を入れておき、1列目はA1からE1まで無事表示できました。 しかし、2列目以降にA1からE1の各セルの式を転記しますと、 1  5 4 3 2 1    54321 2  1 1 1 2 3     123 3  2 2 2 2 2      22 4  6 6 6 5 2     652 5  9 9 9 9 9       9 と、なってしまいました。空白にしたいところに指定セルのトップの数字が入ってしまうんです。指定したセルの数字の桁数よりも大きな部分は空白にしたいのですが、 「もしも何かの条件に合わねば空欄に」というようなことができれば幸いなんですが、どのようにすればいいのかをお教えください。

  • エクセルのセルに入れた文字あるいは数字を別なセルに1文字づつ、「右詰」で移したい

    以前に エクセルのセルに入れた文字あるいは数字を別なセルに1文字づつ移したい、ということで質問しまして、「MID関数を利用する」事で、先頭文字から一文字ずつ別々なセルに移すことが出来ましたが、スミマセンが次のような場合はどのような関数になるのでしょうか? 例えば「番地などの表示」等で1桁の場合もあれば、5桁あるいは6桁等々の場合もあるとします。これを別なセルに下一桁を合せる様にしたいのです。 例としまして セルA1に1桁~6桁の数字(例:345678)を入力した場合、これを右側のB1には3を、同様にC1には4を、D1=5、E1=6、F1=7、G1=8を関数で入力できるようにしたい。 問題は、桁数が毎回違う場合にG1に下一桁が来るようにしたいのですがRIGHT関数では下一桁だけ応答されるのは上手くいくのですが、下二桁、三桁以上の場合には上手くいきません。 つまり「A1に789」の数字を入力したら、G1=9が、F1=8が、E1=7が応答されるようにしたいのです。 勿論、5桁の場合にはB1が空欄で、C1、D1、E1、F1、G1が埋まる様に、4桁であればB1とC1が空欄で、D1~G1が埋まるように、三桁の場合にはB1~D1が空欄でE1~G1が埋まるようにですが、出来ますでしょうか?? よろしくご教授お願いします。

  • EXCELの「行列を入れ替える」マクロについてどなたか教えていただけないでしょうか?

    EXCELの「行列を入れ替える」マクロについてどなたか教えていただけないでしょうか? 下記のようにならんだDATAがあります。   A列   B列  C列  D列  E列 (1行)2002/12/17 15240 15280 15220 15220 (2行) (3行) (4行) (5行)2002/12/18 15250 15250 15210 15210 (6行) (7行) (8行) (9行)2002/12/19 15220 15310 15220 15310 (10行) (11行) (12行) (13行)2002/12/20 15220 15260 15210 15230 (14行) (15行) (16行) (17行)2002/12/24 15300 15310 15270 15310 (18行) (19行) (20行) (21行)2002/12/25 15300 15340 15300 15600  . . . . . . . . . . . . . . . . . . . . . . . と,このようにDATAは日付の横に数値が4つずつ横に並んでおりますが、この4つの数値をその4つ目の数値の真横のF列から縦に4つ並べたいのですが、一気にできるマクロがないものでしょうか?下記のようにです。   A列   B列 C列 D列 E列  F列 2002/12/17            15240                  15280                  15220                  15220 2002/12/18            15250                  15250                  15210                  15210 2002/12/19            15220 15310 15220 15310                   . . .                    といった感じに一気にマクロで処理してしまいたいのです。DATAはかなりの行数あり、すべて3行の間隔があります。日付の横に4つの数値が規則的に並んでいるというものです。何回でもマクロボタン一発で4つの横に並んだ数値のみを縦に並べた4つの数値にしたいのです。つたない説明で大変申し訳ありませんが、どなたかわかる方お教えくださいませ。

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

    下記の処理をエクセルのマクロで行いたいのですが、どのように記述したよいか教えてください。 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列は何もしない

  • エクセルの関数を教えてください。

    セルHにIFとANDを使って下記内容の関数式を入力したいです。 セルAからセルF内すべてに数値が入っていたらセルFを返す、 セルFが空欄ならばセルEの数値を返す、 セルEも空欄ならばDの値を、 Dも空欄ならばCの値を、Cも空欄ならばBの数値を、 Bも空欄ならばAの数値を返し、 Aも空欄(つまりAからF内に数値なし)ならばスペースを返す。 わかる方、教えてください。 よろしくお願いします。

  • Excel 2007 マクロ 文字列の抽出について

    Excel 2007 マクロ 文字列の抽出について 元データのB列(番号)に5桁、3桁、7桁の数字が入っています。 その番号をSheet2にコピーして貼り付けます。 貼り付ける際に、5桁、3桁、7桁をそれぞれの列に入れます。 Sheet2のB列(番号2)で400番台はF列(種別)に国産 同じくB列(番号2)で900番台はF列(種別)に外国産 を反映するようにしたいです。 どのようなマクロになりますでしょうか。 サンプルがございましたら、お教えください。

  • エクセルで数値と文字が入ったセルからの数値の抽出

    皆さんこんにちは。 エクセルの使い方についての質問です。 添付画像の例のようにA列に 「XXYYYZZ(XとZは文字、Yは数値で3桁または4桁)」というフォーマットで 数値と文字が入っているセルがあります。 同様にB列には「WWZ(Wは数値)」というフォーマットで、 同様に数値と文字が入っているセルが並んでいます。 これらからDやE列にあるように数値のみを取り出すためには DやE列にどのような関数を入れてやればよいのでしょうか。 どなたか教えていただければ幸いです。 よろしくお願いします。

  • EXCELのマクロにて、ゼロパティングをしたい

    A列とB列に3バイトと4バイトの数字がずらっとはいっています。 A列の数値はA2からB列の数値はB2から入っています。、 A列には1ケタから3ケタまでの数が入り、桁数が足りない場合はゼロパティングします。 B列同じです。 やりたいことは、A列とB列の値を縦のセルごとに最終レコードまで結合していきたいのです。 これをVBAでやりたいのです。 入力値によって0の個数が変わる場合の処理がどうしても思い浮かびません。 どなたか知恵を貸していただきたいです。 過去ログに似たようなものがあったのですが、なかなか考えられませんでした。

専門家に質問してみよう