• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCELの表の展開の仕方を教えてください(VBAを利用?))

EXCELの表の展開の仕方を教えてください(VBAを利用?)

このQ&Aのポイント
  • EXCELの表の展開方法について、VBAを利用して1行1商品に展開する方法を教えてください。
  • EXCELの表には1ユーザ1行で200行以上の表があり、A列、B列は固定でC列以降に複数の商品(数は20以下の任意数)が登録されています。これを1行1商品に展開し、別のシートに表示させる方法をご教示ください。
  • EXCELの表の展開(分解)方法についてお伺いします。1ユーザ1行で200行以上の表があり、C列以降には複数の商品が登録されています。これを1行1商品に展開し、結果を別のシートに表示させる方法を教えてください。

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

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

こんにちは! 一例です。 Sheet1のデータは2行目からあり、Sheet2の2行目以降に表示されるとします。 ちょっと強引な方法ですが、Sheet1のSheet見出し上で右クリック → コードの表示 を選択し、 ↓のコードをコピー&ペーストしてマクロを実行してみてください。 Sub test() Dim i, j, k As Long Dim ws1, ws2 As Worksheet Set ws1 = Worksheets("sheet1") Set ws2 = Worksheets("sheet2") i = 2 j = 2 k = ws1.UsedRange.Columns.Count Do While i <= j Do While j <= WorksheetFunction.CountA(ws1.Range(Cells(2, 3), Cells(i, k))) + 1 With ws2.Cells(j, 1) .Value = ws1.Cells(i, 1) .Offset(, 1) = ws1.Cells(i, 2) End With j = j + 1 Loop i = i + 1 Loop Dim L, M, N As Long L = 2 For M = 2 To ws1.Cells(Rows.Count, 1).End(xlUp).Row For N = 3 To ws1.Cells(M, Columns.Count).End(xlToLeft).Column ws2.Cells(L, 3) = ws1.Cells(M, N) L = L + 1 Next N Next M End Sub 以上、参考になればよいのですが・・・m(__)m

bake_bakeratta
質問者

お礼

ありがとうございました! 頂いたコードで目的の結果が得られました。 VBAはまだまだ初心者ですが、頂いたサンプルコードを1行1行確認させていただき 勉強していきたいと思います。 明日、出社して早速作業ができそうです。 本当にありがとうございました。

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

その他の回答 (2)

noname#204879
noname#204879
回答No.2

Sheet2!A2: =OFFSET(Sheet1!$A$2,(ROW(A1)-1)/4,COLUMN(A1)-1) Sheet2!B2: 上式をドラッグ&ペースト Sheet2!C2: =OFFSET(Sheet1!$C$2,(ROW(A1)-1)/4,MOD(ROW(A1)-1,4)) 範囲A2:C2 を下方にズズーッとドラッグ&ペースト(Fig2) シート全体(あるいはシート内の全データ範囲)を選択して[コピー]→[値の貼り付け]を実行 C列が 0 のレコードを[オートフィルタ]で抽出(Fig3) 抽出された全行を削除して[オートフィルタ]を解除(Fig4)

bake_bakeratta
質問者

お礼

なるほど~! こういう方法もあるんですね。 とても参考になりました。 今回の例ではC列からF列までの4列にに商品が入っているので「4」という定数が 使われていると思いますが、(今回のMAXは20列なので)「20」を入れてフィルタで 抽出すれば求める結果も得られますね。 ありがとうございました。

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

VBAの例です。 Sheet1からSheet2に書き出します。 Dim rng As Range Dim myval As Variant Dim n As Integer Dim i As Long Dim j As Long Dim k As Long With Sheets("Sheet1") Set rng = .Range("A2", "F" & .Range("A" & Rows.Count).End(xlUp).Row) End With For i = 1 To rng.Rows.Count myval = rng.Rows(i).SpecialCells(xlCellTypeConstants).Cells.Value n = rng.Rows(i).SpecialCells(xlCellTypeConstants).Cells.Count With Sheets("Sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1) For j = 3 To n .Offset(k, 0).Value = myval(1, 1) .Offset(k, 1).Value = myval(1, 2) .Offset(k, 2).Value = myval(1, j) k = k + 1 Next j k = 0 End With Next i

bake_bakeratta
質問者

補足

ありがとうございます。 サンプルのシートで変換できました。 1点、今回のシートはデータがF列までなので、下記のように指定されていると 思うのですが、実際は任意列(20以下ですが)までデータが入っています。 ----- With Sheets("Sheet1") Set rng = .Range("A2", "F" & .Range("A" & Rows.Count).End(xlUp).Row) End With ----- この場合、それぞれの行で最終列をカウントしその範囲を指定となりますが どのように記述を変更すればよいか教えていただけないでしょうか? せっかくですので、頂いたサンプルコードでも実行したいと思っています。 よろしくお願いします。

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

関連するQ&A

  • エクセルの表をさらにマトリクス表に展開したい。

    初めて質問させて頂きます。 仕事上でエクセル2003を使用しています。 以下の作業を簡単にできるように、数式またはマクロを組むことを考えています。 表1を表2のように展開する。(例) 表1    A  B  C 1  A1 B1 あいうえお 2  A2 B2 かきくけこ 3  A3 B1 さしすせそ 4  A4 B2 たちつてと 5  A1 B1 なにぬねの 表2    A    B       C   1       B1      B2 2  A1 あいうえお      なにぬねの 3  A2         かきくけこ  4  A3 さしすせそ  5  A4         たちつてと ※行の数は実際はもっと多いです。  また表2のB2に記入してある内容は  複数行になっても構いません。 まずはマクロ(VBA)を使わずにできるかやってみましたが、 VLOOKUPなどでは、なかなかうまくいきません。 よい方法はないでしょうか? VBA使用でもかまいません。 ヒントだけでもぜひよろしくお願いします。

  • エクセルVBAについて

    VBAに関しての質問です。 A列に日付(10行目から) B列にその日の売上が 300行(300日分)入力されてる表があるとします。 C列にその日を含めた過去N日間の最大の売上を表示させたいのです。 例えば 過去5日間なら過去5日間の最大売上げを毎日表示させたいのです 当然この場合は5日間なのでCの13行目までは空白になります。 「N」日はA1セルに任意の日数で入力することによって希望の期間の数値 が表示できるようにしたいのです。 関数を使ってできるのいですが、事情がありましてエクセルのマクロの 繰り返しのプログラムでやりたいのですが VBAに関しては全く素人ですの。どなたかご教授願えませんでしょうか よろしくお願いします。

  • Excel VBAのカウントについて

    Excel2003で表を作成しています。 画像のような表を作成しているのですが、 左のデータから右の表に数を入力するのに、VBAで出来ないでしょうか? COUNTIFを使おうと思ったのですが、COUNTの条件が3つありますし、 左のABCの列は500行くらいデータが入っているので出来ればVBAで出来たらと思いました。

  • エクセル:列の範囲選択をうまくできないでしょうか ?

    行数が約2000行ほどの表を毎月使用します。それでいろんな列をコピーして別の表に貼り付けたいのですが、列のコピーをする時に範囲指定でドラッグに結構時間がかかります。これをマクロでやりたいんですが、カーソルをおいた列の一番下の行まで範囲を指定すると言うのをマクロでできないでしょうか? 自動記録でマクロを造ろうとすると、実行した列を選択してしまい、任意の列の選択ができません。 よろしくおねがいします。

  • VBAでエクセルのいくつかの表を同じ配列に格納する

    VBA初心者です。 調べてみましたがどうにも情報に行きあたらなく、ご質問をさせていただきます。 添付のようなエクセル上の同一シート上にある3つの表をコピーし、VBAで同じ配列の各列として取り込みをしたいと考えております。 大分類、中分類、小分類のそれぞれの行は同じもののそれぞれの内容を記載しており、 できればこれらを同じ配列の1列目、2列目、3列目に格納をしたいと思っております。 これらの表が1つの表にまとまっていれば、 Dim 配列(1,10) as Variant 配列 =range("A1:C10") で事足りると思うのですが、別々のためこの方法がとれません。 セル指定で行うことも考えましたが、データが10万行を超える場合もあるため、できれば避けたいと思っています。 各表を指定し、配列の1列目、2列目、3列目に一括して代入をご存じでしたらら、どうぞ教えていただきたいと思います。 どうぞよろしくお願いします。

  • Excel Vba でデータの範囲を知るには?

    Excelを使用していますが、マクロ(VBA)で、シートのデータの範囲を知るにはどうすればよいのでしょうか。  印刷プレビューを行うと、自動的にページ数が求めらていますが、これは、シートのデータの範囲(列及び行の最大値)を判別しているからできるのだと思います。  これを、VBAで行、及び列のMAX値を取得したいのですが、そのメソッド(プロパティ)を知りたいのです。  どなたかご教授ください。

  • エクセル VBA

    エクセルVBAを使った方法を教えて頂きたいです。 画像参照※○○は商品名であり、それぞれ異なる名前と仮定 画像のように商品名 個数 単価 合計金額 と分けたいです。最後には消費税とどこに送るかといった形でまとめています。 このような分解する前のデータが約1000件あります。 これをVBAを使ってわけていきたいのです。 画像の通り商品名の後にスペースなしで個数が入ってきたりします。 それから商品名はほぼ毎月固定なので商品名自体のデータはあります。 どうかよろしくお願いします。

  • エクセル表のカウントの仕方について

    エクセルの表でいいカウントの仕方を教えてください。 まず思い浮かべて頂きたい簡単な表の例を示しておきます。行は20行程度というのを思い浮かべてください。 A列には1~10の数字、B列にはあ~んの五十音の一文字のみが、それぞれ重複ありで記入されているような単純な表です。 そこで、A列が「5」かつB列が「あ」という両条件を満たした行の数を、どこかのセルにカウントして表示したいのですが、私の能力では経験不足でできないで困っています。 どうすればいいのか教えていただきたいのです。 よろしくお願いします。

  • エクセル表加工のアドバイス求む

     先日エクセルの操作に困って質問をアップしたところ、たちまち快刀乱麻を断つ如き解決法を伝授いただきました。調子に乗ってもう一度相談させていただきます。  あるところから商品販売データが毎月提供されます。表のA列には商品コード、B列には販売数量、C列には販売金額が入っています。(本当はもう少し複雑な表ですが、相談のために単純化しました)  商品は全てのアイテムが毎月販売されるとは限らず、販売終了となるアイテムや新規取り扱いとなるアイテムもあり、表中の商品はアイテム数も種類も毎月異なります。当然表の行数は毎月異なることになります。  この単月毎の表を12ヶ月の商品毎の販売数・販売金額の一覧表にしたいのです。できることであれば毎月最新のデータで表を更新して直近12ヶ月の表を毎月作成したいのです。  どうぞ、良いアイディアを教えて下さい。

  • エクセル VBAでこれは難しいですか?

    列 A B C D 行 1 T1 あ 1 2 2 T2 い 4 5 3 T3 う 7 5 分かりにくいかもしれませんが、上記のような表があるとします。ファイル名:AA.xlsとします。 ”行1”の「T1」や「あ」等はファイルにより違うとします。 1つのファイルの1シートにこういった表が改ページにより(ある領域で1,2ページとしている)たくさんあります。 これを必要な行、列をVBAで作成されたボックス?に入力方式で行、列を入力して、入力された例えば"B"列が削除され、その部分は左詰にされ、そのファイルが新しく別のファイル名で例えばAB.xlsが自動的に作成することは可能でしょうか? 手順としては 1 ファイルにより必要、不要な列・行が違うのであらかじめ削除する列・行を確認する。(このファイルをA1.xlsとする) 2 実行したいファイルを参照で(任意のフォルダに進めるよう)読み込めるようにしたVBAを開き、A1.xlsを選択する。 3 削除したい列・行を入力できる窓があり、そこに打ち込む。 4 削除した列・行のスペース分左詰め、上詰めにされたA2.xlsというファイルが同一フォルダ内に作成される。 VBAは全くの初心者で、インターネットで勉強を始めようとしている青二才です。 最終的にはこれ以上のことをしたいですが、まずは最低限これをしたいです。 余談ですが、これができるようになるためにはやはり一から勉強をするしかないのでしょうか? 今したいことがずばり載っている入門書のそのページだけ勉強しても不可能でしょうか? ・PS3のあるゲームのキャラクターの必殺技のコマンドを覚えても、まずPS3をどうやって起動するのか? という考えと一緒でしょうか?

専門家に質問してみよう