• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルの表をさらにマトリクス表に展開したい。)

エクセルの表をマトリクス表に展開する方法は?

このQ&Aのポイント
  • エクセルの表をマトリクス表に展開する方法について質問です。
  • 初めて質問させていただきます。エクセル2003を使用していますが、表をマトリクス表に展開する方法を知りたいです。
  • マクロ(VBA)を使わずにエクセルの表をマトリクス表に展開する方法について教えてください。VLOOKUPなどを試しましたがうまくいきません。

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

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

関数で対応する方法です。式が複雑になりますので作業列を作って対応します。作業列は目障りでしたら最後にそのれの列を非表示にすればよいでしょう。 表1はシート1に有ってA、B、C列の2行目から下方にデータが入力されているとします。 結果の表はシート2に表示させることにしてA列のA1、A2、・・や2行目のB1、B2、・・・などは自動でシート2に表示できるようにします。また、A1-B1の組み合わせでは一つのセルに2行の文字列を書くことはやめて行を増やして並べて表示させるようにします。 シート1での作業列ですがD2セルには次の式を入力いて下方にオートフィルドラッグします。 =IF(A2="","",IF(COUNTIF(A$2:A2,A2)=1,COUNTIF(A:A,A2)+MAX(D$1:D1),"")) E2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(B2="","",IF(COUNTIF(B$2:B2,B2)=1,MAX(E$1:E1)+1,"")) F2セルには次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",A2&B2&"/"&(COUNTIF(F$1:F1,A2&B2&"*")+1)) シート2では次のようにします。 A3セルには次の式を入力して下方にオートフィルドラッグします。 =IF(ROW(A1)>MAX(Sheet1!D:D),"",IF(ROW(A1)=1,Sheet1!A$2,IF(COUNTIF(Sheet1!D:D,ROW(A1)),INDEX(Sheet1!A:A,MATCH(ROW(A1),Sheet1!D:D,0)),A2))) B2セルには次の式を入力して横方向にオートフィルドラッグします。 =IF(COLUMN(A1)>MAX(Sheet1!$E:$E),"",INDEX(Sheet1!$B:$B,MATCH(COLUMN(A1),Sheet1!$E:$E,0))) B3セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(OR(B$2="",$A3=""),"",IF(ISERROR(INDEX(Sheet1!$C:$C,MATCH($A3&B$2&"/"&COUNTIF($A$3:$A3,$A3),Sheet1!$F:$F,0))),"",INDEX(Sheet1!$C:$C,MATCH($A3&B$2&"/"&COUNTIF($A$3:$A3,$A3),Sheet1!$F:$F,0))))

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.1

関数ではうまく出来ないので、マクロにやらせるのが適当です。 ご質問の状況設定がイマイチ曖昧ですが、表2の縦項目(A1,A2…)や横項目(B1,B2…)について ○そもそもどういった項目が表1に存在するのか、調査することからはじめたい ○表2の縦横項目は所定の順序で「作成済み」であり、その表の中を埋めるだけのマクロが欲しい ご質問の提示をみると後者であると読めますが、もし前者からマクロでやらせたいのでしたら、縦項目横項目を作表するマクロについて別途ご質問を投稿して頂いたほうがよいと思います。 前置きが長くなりましたが、こんな具合でしょうか。 表1はシート1のABC列に並んでいるとして 表1はタイトル行など用意せずいきなり1行目から実データを並べているとして 表2はシート2のA1を左上コーナとして配置済みだとして sub macro1()  dim r as long  dim c as long  dim i as long  on error resume next  worksheets("Sheet1").select  with worksheets("Sheet2")  .cells.clearcontents  for i = 1 to range("A65536").end(xlup).row  if application.countif(.range("A:A"), cells(i, "A")) > 0 then   r = application.match(cells(i, "A"), .range("A:A"), 0)  else   r = .range("A65536").end(xlup).row + 1   .cells(r, "A").value = cells(i, "A").value  end if  if application.countif(.range("1:1"), cells(i, "B")) > 0 then   c = application.match(cells(i, "B"), .range("1:1"), 0)  else   c = .range("IV1").end(xltoleft).column + 1   .cells(1, c).value = cells(i, "B").value  end if   .cells(r, c) = iif(.cells(r, c) = "" , "", .cells(r, c) & vblf) & cells(i, "C")  next i  end with end sub

sashimi5959
質問者

お礼

内容の説明不足でありながら、 自分のやりたい結果がうまく表示されました。 実際にはもっともっと複雑な表なので、 参考にさせていただき、改良して使用したいと思います。 ありがとうございました。

関連するQ&A

専門家に質問してみよう