• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCELの関数について)

EXCEL関数で表を自動的に作成する方法

このQ&Aのポイント
  • EXCELの関数を使用して、色々なデータから表を自動的に作成する方法について質問があります。
  • 質問の内容は、A列B列C列...に配置されたデータをA列B列C列...の形式の表に変換する方法です。
  • vlookupやhlookupでは一行ずつ打ち直す必要がありますが、他の方法で効率的に表を作成する方法を教えてください。

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

  • ベストアンサー
  • MASUKUBO
  • ベストアンサー率22% (4/18)
回答No.3

シート1では1行目には項目名が有って、2行目のA2セルから右に例えばX2せるまでデータを入力するとした場合に、常にそのデータをシート2の該当する日にちの場所に表示させるとしても、2行目に入力するデータが次々に変わっていく場合にそれらのデータを次々にシート2に表示させることはマクロでなければできません。 関数を使ってシート2にデータを表示させるようにするためにはシート1で2行目だけにデータを入力するのではなく、日にちが変わるごとに下の行にデータを入力していくことが必要です。 その場合にシート2に表示させるとしたら次のようにします。 シート2の1行目にはシート1で使っている同じ項目名を入力します。空白の列が有っても構いません。 シート2のA2セルから下方には1日、2日、・・・と日付を入力します。 B2セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(OR(COUNTIF(Sheet1!$A:$A,$A2)=0,COUNTIF(Sheet1!$1:$1,B$1)=0),"",VLOOKUP($A2,Sheet1!$A:$X,MATCH(B$1,Sheet1!$1:$1,0),FALSE))

noritama12
質問者

お礼

回答ありがとうございます。 >>2行目に入力するデータが次々に変わっていく場合にそれらのデータを次々にシート2に表示させることはマクロでなければできません。 関数を使ってシート2にデータを表示させるようにするためにはシート1で2行目だけにデータを入力するのではなく、日にちが変わるごとに下の行にデータを入力していくことが必要です。 やはりマクロが必要ですか。日にちが変わるごとにデータを入力はできれば避けたいのでマクロでやろうと思いますが、具体的にどうすれば良いのでしょうか。 マクロは同じ操作しかできないはずですが、可能なのでしょうか。

その他の回答 (3)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 回答番号ANo.2です。 >上記の表をいくつもつくるだけで  上の表ではA2セルに「1日」と入力されているのに対し、2番目の表のA2セルには「4日」と入力されている事から考えますと、上の表と2番目の表の並び方は、      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c   e   g   i   b   d   h  f 2行目  1日  ノ  ケ   リ   ム   ラ  チ   セ   ロ   レ 3行目(空欄) 4行目      n   h   a   k   x   b   d   h  f 5行目  4日  110  120   140   ム   ラ  チ   セ   ロ   レ という様な形で、一つのシート状に複数の表が並んでいるのではなく、 例えば、Sheet3には、      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c   e   g   i   b   d   h  f 2行目  1日  ノ  ケ   リ   ム   ラ  チ   セ   ロ   レ Sheet4には、      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      n   h   a   k   x   b   d   h  f 2行目  4日  110  120   140   ム   ラ  チ   セ   ロ   レ という具合に、複数のシート上に、各々1枚ずつの表が存在していると考えて宜しいのでしょうか?   もしそうだとしますと、次の様な方法があります。  今仮に、適当な空きシート(ここでは仮にSheet2)に作業列を設けておき、Sheet1に並べ替えた結果を表示させるものとします。  まず、Sheet2のB列に 1行目  Sheet3 2行目  Sheet4 3行目  Sheet5 4行目  Sheet6 という具合に、元データの表が存在している各Sheetのシート名を、全て入力して下さい。  尚この時、シート名「Sheet1(2)」やシート名「1」の様に、そのSheetを参照する関数を作った際に、「'Sheet1(2)'!」や「'1'!」という具合に、シート名が「' '」で括られる様になるシート名を入力する際には、 ="'Sheet1(2)'" ="'1'" という具合に、シート名を「="' '"」で括った形で入力して下さい。(参照した際に「' '」で括られないSheetに関しては、単純にシート名をそのまま入力して下さい)  次に、Sheet2のC1セルに次の関数を入力して下さい。 =IF(ISERROR(INDIRECT($B1&"!A2")),"",INDIRECT($B1&"!A2"))  次に、Sheet2のD1セルに次の関数を入力して下さい。 =IF($C1="","",SUBSTITUTE(INDIRECT($B1&"!A2"),"日",)*1)  次に、Sheet2のA1セルに次の関数を入力して下さい。 =IF(ISNUMBER($D1),$D1+COUNTIF($D$1:$D1,$D1)/COUNTIF($D:$D,$D1),"")  次に、Sheet2のC1~D1の範囲をコピーして、同じ列の2行目以下に貼り付けて下さい。  次に、Sheet2のA1セルをコピーして、Sheet2のA2以下に貼り付けて下さい。  次に、Sheet1のA2セルに次の関数を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet2!$A:$A),"",VLOOKUP(SMALL(Sheet2!$A:$A,ROWS($2:2)),Sheet2!$A:$C,3,FALSE))  次に、Sheet1のB2セルに次の関数を入力して下さい。 =IF(ROWS($2:2)>COUNT(Sheet2!$A:$A),"",IF(COUNTIF(INDIRECT(VLOOKUP(SMALL(Sheet2!$A:$A,ROWS($2:2)),Sheet2!$A:$B,2,FALSE)&"!1:1"),B$1)=0,"",HLOOKUP(B$1,INDIRECT(VLOOKUP(SMALL(Sheet2!$A:$A,ROWS($2:2)),Sheet2!$A:$B,2,FALSE)&"!1:2"),2,FALSE)))  次に、Sheet1のB2セルをコピーして、(表中の)Sheet1のB2よりも右側にあるセルに貼り付けて下さい。  次に、Sheet1の2行目で、関数が入力されている全てのセルを含むセル範囲をコピーして、Sheet1の3行目以下に貼り付けて下さい。  以上で準備は完了で、後はSheet1のB1セルから右方向に向かって、      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c    e    g    i    b    d    h   f という具合に、1行目の項目を入力しますと、並べ替えた結果が自動的に表示されます。

noritama12
質問者

お礼

回答ありがとうございます。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 やりたいことが良く解らないのですが、もしかしますと、例えばSheet1に      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c   e   g   i   b   d   h  f 2行目  2日 ○  △  □  ●   ■  ▽   ◆   △   ▲ 3行目  3日 あ   う   き   と   ま   い   し   て   こ 4行目  1日 ノ   リ   ラ   セ   レ   ケ   ム   ロ   チ などと並んでいる場合に、Sheet2に      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c   e   g   i   b   d   h  f 2行目  1日 3行目  2日 4行目  3日 などと入力しておけば、      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c   e   g   i   b   d   h  f 2行目  1日  ノ  ケ   リ   ム   ラ  チ   セ   ロ   レ 3行目  2日  ○ ▽   △  ◆   □  ▲   ●   △  ■ 4行目  3日  あ  い   う   し   き   こ   と   て   ま という具合に、Sheet1のデータを、Sheet2に並べ替えて表示させたいという事なのでしょうか?  もしそうだとしますと、Sheet1のB2セルに次の数式を入力してから、Sheet1のB2セルをコピーして、Sheet1のB2~J4の範囲に貼り付けると良いと思います。 =IF(OR(COUNTIF(Sheet1!$A:$A,$A2)=0,COUNTIF($A$1:$J$1,B$1)=0),"",INDEX(Sheet1!$A$1:$J$4,MATCH($A2,Sheet1!$A:$A,0),MATCH(B$1,$A$1:$J$1,0)))

noritama12
質問者

お礼

回答ありがとうございます。 わかりづらくて申し訳ございません。 回答いただいた表で説明しますと、何月何日という日にちのA列と、1行目の項目、そして日にちと項目のクロスする部分の合計3つの欄が変わるります。 具体的にはこんな表がいくつも(1~31日の31日分)あります。      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c   e   g   i   b   d   h  f 2行目  1日  ノ  ケ   リ   ム   ラ  チ   セ   ロ   レ      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      n   h   a   k   x   b   d   h  f 2行目  4日  110  120   140   ム   ラ  チ   セ   ロ   レ 上記の表をいくつもつくるだけで 自動的に下記の表を得たいのです。      A列  B列  C列  D列  E列  F列  G列  H列  I列  J列 1行目      a   c   e   g   i   b   d   h  f 2行目  1日  ノ  ケ   リ   ム   ラ  チ   セ   ロ   レ 3行目  2日  ○ ▽   △  ◆   □  ▲   ●   △  ■ 4行目  3日  あ  い   う   し   き   こ   と   て   ま ここで問題になっているのが、1日分であればhlookupなどを使って、関数を入力できるのですが、 31日分も参照するセルを変えて作らなければいけない点です。 これをなんとか解消したいのですが…

回答No.1

  元の表の1行目を右クリックして「行の挿入」を選んでください。 そうすれば「1日」を追加できます。  

noritama12
質問者

お礼

回答ありがとうございます。

関連するQ&A