• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAで以下の行列を作る方法)

エクセルVBAで行列を作る方法は?

このQ&Aのポイント
  • エクセルVBAを使って、指定のデータを目的の形に変換する方法について教えてください。
  • 具体的には、A列とB列で表されるデータを、B列の要素ごとに行を展開して新しいシートに表示する方法が知りたいです。
  • B列には4個以下のデータが含まれており、改行や空白で区切られている場合もあります。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.2です。 >混在したプログラムは作れないので とありましたので、一気にやってみました。 区切りられている文字は 読点(、)・半角スペース・全角スペース・改行  にしています。 Sub Sample2() Dim i As Long, j As Long, k As Long, cnt As Long Dim wS1 As Worksheet, wS2 As Worksheet, myArray1, myArray2, tmp Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") myArray1 = Array("、", " ", " ", vbLf) '←ココに「区切り」の文字を追加する For i = 1 To wS1.Cells(Rows.Count, 1).End(xlUp).Row tmp = wS1.Cells(i, 2) For j = 0 To UBound(myArray1) tmp = Replace(tmp, myArray1(j), ",") '←区切り文字をすべてカンマ(,)に置換 Next j myArray2 = Split(tmp, ",") For k = 0 To UBound(myArray2) cnt = cnt + 1 With wS2.Cells(cnt, 1) .Value = wS1.Cells(i, 1) .Offset(, 1) = myArray2(k) End With Next k Next i End Sub 今度はどうでしょうか?m(_ _)m

yataharu
質問者

お礼

ご連絡遅くなりました。 tom04さんありがとうございます!!! 色々思考錯誤していたのですが、 私の書いたプログラムはVBAさんに怒られまくっていたので 本当に助かりました。 他の皆様も本当にありがとうございました。 BAを選ぶというのも変な形ですが、2回記載して頂いたtom04さんをBAにさせて頂きます。 私も早く上達し、教えてあげられるように精進します。 この度は皆様ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • mindatg
  • ベストアンサー率48% (110/227)
回答No.3

>混在したプログラムは作れないので(汗) >別々のマクロを作り、 >1つずつ実施していこうと思います。 そういうのは区切り文字全てを総当りで探し特定の区切り文字に置き換えてしまう No2の回答の For i = 1 To wS1.Cells(Rows.Count, 1).End(xlUp).Row myArray = Split(wS1.Cells(i, 2), "、") For k = 0 To UBound(myArray) これを、 For i = 1 To wS1.Cells(Rows.Count, 1).End(xlUp).Row myArray = mySplit( wS1.Cells(i, 2) ) For k = 0 To UBound(myArray) に変更し、以下の関数を適当なとこに貼り付け ' 区切り文字総置き換え&Split ただしテストしてません Function mySplit(varData As Variant) As Variant() ' 想定しうる区切り文字 hoge() = Array("、", " ", "。", vbCrLf) Dim stTemp As String Dim stBuff As String Dim stDelim As String stDelim = "@" ' 区切り文字を全て@に置き換える stTemp = varData ForEach( piyo In hoge ) { stBuff = Replace(stTemp, piyo, stDelim) stTemp = stBuff } Dim aryData() As Variant aryData() = Split(stTemp, stDelim) ' 全て@で分解 mySplit = aryData End Function データの名前に区切り文字が含まれている場合  例) 山崎の、食パン、お菓子、スイカ メロン このケースは非常に面倒くさいです。力技でやったほうが早いかも

yataharu
質問者

お礼

mindatgさんありがとうございます!!! @にしてしまうのは発想の転換ですね・・・・。 尊敬してしまいます。 書き方は頂いているので、 これを理解しながら自分で組み立ててみます! プログラムをレベルアップして頂き本当にありがたいです。 本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんにちは! 一例です。 Sheet1のデータをSheet2に表示するようにしてみました。 Sheet1のB列は「、」で区切られているとします。 標準モジュールにコピー&ペーストしてマクロを実行してみてください。 Sub Sample1() Dim i As Long, k As Long, j As Long, cnt As Long, str As String, myArray, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") For i = 1 To wS1.Cells(Rows.Count, 1).End(xlUp).Row myArray = Split(wS1.Cells(i, 2), "、") For k = 0 To UBound(myArray) If myArray(k) <> "" Then cnt = cnt + 1 With wS2.Cells(cnt, 1) .Value = wS1.Cells(i, 1) .Offset(, 1) = myArray(k) End With End If Next k Next i End Sub ※ 上記コードでは区切りを「、」(読点)としていますが、 >本当はB列の区切りが改行だったり、空白だったりするのです・・。 とありますので >myArray = Split(wS1.Cells(i, 2), "、") の部分を 空白(全角)の場合は >myArray = Split(wS1.Cells(i, 2), " ") 改行の場合は >myArray = Split(wS1.Cells(i, 2), vbLf) のように変更してみてください。 尚、これらが混在している場合は少し厄介になると思います。 やり方としては区切られている文字を一旦何らかの文字に統一して、その文字で区切る!って感じでしょうかね? この程度でごめんなさいね。m(_ _)m

yataharu
質問者

お礼

tom04さんありがとうございます。 空白や改行の場合も困っていたので本当にありがたいです。 混在したプログラムは作れないので(汗) 別々のマクロを作り、 1つずつ実施していこうと思います。 こんなに早くありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

こんな感じでどうでしょう Sub sample()   Dim nMaxRow, nWriteRow, i, j, sDataA   Dim sDataB   nMaxRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row   For i = 1 To nMaxRow     sDataA = Sheets(1).Cells(i, 1).Value     sDataB = Split(Sheets(1).Cells(i, 2).Value, "、")     For j = 0 To UBound(sDataB)       nWriteRow = nWriteRow + 1       Sheets(2).Cells(nWriteRow, 1) = sDataA       Sheets(2).Cells(nWriteRow, 2) = sDataB(j)     Next j   Next i End Sub

yataharu
質問者

お礼

mt2008さん。早速のご返信ありがとうございます。 頂いたプログラムをもとに実行しながら勉強していきます。 しかもB列の内容が何個であっても 実行できるようにして頂き、本当にありがとうございます!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルでヘルプ・・・・

    例えばA列に下記のような名前が並んでいたとします。 この中で同じ文字列のセルを含む行を全て削除する方法です。 下記の例では 5,6,7,8,12,13,14 の行を削除するかたちになります。 A     B     C 1 りんご 2 トマト 3 ブドウ 4 バナナ 5 サクランボ 6 サクランボ 7 メロン 8 メロン 9 みかん 10 バナナ 11 ナシ 12 スイカ 13 スイカ 14 スイカ 実際は5000~6000行データの作業になる為、手作業では大変です。 これがもしエクセルの機能で出来るならとても助かります。 宜しくお願いいたします。

  • かんたんなエクセルマクロを教えてください!

    エクセルマクロを勉強しはじめたばかりのものです。 列にある、様々な文字列で、同じ名前があったときに、 その個数を出すようにするにはどうしたらよいでしょうか? 【例】   C 1名前 2りんご 3メロン 4いちご 5りんご 6レモン 7メロン 8すいか 9メロン 10空白 Cの列に様々な名前の品物があります。そのときに、行の2~9(9はもっと長いときがあり、制限のないものとします) の中の文字列で、同じものがあったときに、その名前と個数を出すようにしたいのです。(C1は見出しなので省きます) 上記の例でしたら、「りんご」が2個、「メロン」が3個あります。2個、3個という数えた個数はB列の同じ場所の一番上に上書きで 出す形で結果を表示したいと思います。例でいえば、「りんご」は2個だったので、B2に「2」と出力。メロンは3個だったので、 B3に「3」と出力させたいのです(B列にはすでに他の文字列が入っています。それを数値で上書きします。) C列をたどって、同じ文字がないときには、「同じものはありません」とメッセージボックスで出力するようなマクロです。 例ではC9までですが、このケースではC10は空白になります。C100まであったときにはC101が空白です。 こんなカンタンなのもわからないので、ぜひお教えいただけますでしょうか?できるだけ短いものが嬉しいです。使っているエクセルはおはずかしながらEXCEL97です。 よろしくお願いします。

  • EXCEL セル内のデータを置き換えたい

    うまく説明できないのですが、 Sheet1のA列とB列に、1つのセルに複数のデータが以下のように入っています。(データの間に「,」があります。)     A列             B列 1行 6599A,6599B,6599C  6599A 2行 6599B,6599C      3行              6599A,6599C これは商品コードでして、Sheet2に明細があります。 A列    B列 りんご  6599A メロン   6599B みかん  6599B Sheet1のデータを、「りんご」「メロン」「みかん」に置き換えたいのです。 データの数が、たくさんあるので、コピー、ペーストでは対応できません。 よい方法をお教えください。よろしくお願いいたします。

  • EXCEL VBAで複数のシートの中から該当値を検索する方法について

    すいません、EXCEL VBAで複数のシートの中から該当する値を検索する方法について教えていただきたいことがあります。      Sheet1              A列   B列  C列   1行  11  りんご  31  2行  12  バナナ  32  3行  13  みかん  33  4行  14  ぶどう  34   ・   ・   ・     ・        Sheet2              A列   B列  C列   1行  31  すいか  11  2行  32  レモン  12  3行  33  パイン  13  4行  34  ざくろ  14   ・   ・   ・     ・ というデータが入っているブックについて 「全部のシートを検索し、A列に11の値が入っているセルの行数及びその行のB列の値」 をSheet1のD1セルとE1セルにそれぞれ返す方法はどうしたらよろしいんでしょうか。 For Each を使うのではないかと思って色々やってみたのですが、どうも上手く作動してくれません。 よろしくお願いいたします。

  • エクセルで並べ替えやフラグ立て

    エクセル2007を使っています。 どれか一個でもいいですので、下記教えて下さい。 A列  B列        C列 品名   店        価格 レモン  八百屋      100 にんじん 八百屋    50  レモン  スーパー     120  すいか  八百屋      720 すいか  スーパー     800 レモン  スーパー     200 メロン 上記で Q1.A列の種類はレモン、すいか、にんじん、メロンの4種類ですが、この4という数字を出す方法を教えて下さい。 Q2 A列に含まれている個数順で レモン レモン レモン すいか すいか にんじん メロン の順で並べ替える方法を教えてください。 Q3 紐づいている種類でフラグを立てる方法 A列のレモンはB列で八百屋とスーパーと紐づいている A列のにんじんは八百屋としか紐づいていない A列のすいかは八百屋とスーパーと紐づいている A列のメロンは紐付けが無い このA列とB列の紐づけのある種類ごとにD列にフラグをたてる方法 例えば レモン  八百屋      100  ○ にんじん 八百屋    50   △ レモン  スーパー     120  ○ すいか  八百屋      720  ○ すいか  スーパー     800  ○ レモン  スーパー     200  ○ メロン                  × 

  • 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つの数値にしたいのです。つたない説明で大変申し訳ありませんが、どなたかわかる方お教えくださいませ。

  • Excelについて

    Excelに下記のようなデータが入っているのですが A列   |   B列 りんご |     2 みかん | 3 ばなな | 1 りんご | 6 すいか | 7 かき | 3 みかん | 4 すいか | 8 りんご | 1 *(実際には100件ぐらいのデータが入っています。) A列で同じ「りんご」があれば、同じ行にあるB列の値を合計したいのでがどうすればよいですか? また「りんご」だけでなく他にもあればその値を合計して出したいのですが。 例えば、今回の例では「りんご」が三箇所あるので「2+6+1]で9と表示したいのですが。 イメージとしては、 A列  |   B列 |   C列   |  D列 りんご |    2  |    りんご |  9 みかん |    3  |    みかん | 7 ばなな | 1  |    ばなな | 1 りんご | 6  |    すいか | 15 すいか | 7  |    かき | 3 かき | 3 | みかん | 4 | すいか | 8 | りんご | 1 | というようにしたいです。どなたか教えてください。

  • ExcelのVBAで連番を振る。

    A列が空白で、B列に1行目から***行目(毎回変わる)までデータが入力されている時、 A列に、1から***まで(B列のデータが終わるまで、連番を振るにはどんなVBAを かいたらいいのでしょうか? お願いします。

  • VBAでの他のシートにコピー

    今sheet1へ、sheet2とsheet3のデータをコピーしようとしています。 sheet1は見出しが2行目にあり、3行目からsheet2をコピーしようとしています。 そのつぎに、sheet3はsheet1にsheet2のコピーした次の行からコピーします。 sheet2    A  B  C 3 鈴木 りんご 5 4 山田 バナナ 1 sheet3   A  B  C  3 大羽 メロン 2 4 鷲尾 スイカ 1     ↓2行目まで見出しがあるsheet1に sheet1   A  B  C 3 鈴木 りんご 5 4 山田 バナナ 1  5 大羽 メロン 2 6 鷲尾 スイカ 1 このとき、シート2とシート3は数は決まっていません。 そして、数が0のときもあるので「sheet2とsheet3にデータがないときはコピーしない」 をというふうにしたいのですが、どのようにすればよろしいですか? VBAで行いたいです。よろしくお願いします。

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ