プロが教える店舗&オフィスのセキュリティ対策術

エクセル:複数シートのデータを一覧シートに自動的に表示させるには?

こんにちは。
以前同じ質問をさせて頂いたのですが、締め切った後で試したところ
どうにもうまくいかず(試さずに締め切ってしまった私が悪いのですが・・)、
もう一度質問させていただきます。

複数シート(6シート程度)に同一形式のリストがあり、あるシートに入力していくと
同一ファイル内の「一覧シート」に自動的にID番号順に表記される(※下記参照)
というようにしたいと考えております。

何かよい方法はありますでしょうか?
お知恵を拝借できれば幸いです。宜しくお願い致します。

(例)
Sheet1
ID 日付     名前  達成度・・・(項目=15項目ぐらい)
1 2010/10/17  山田  A
4 2010/10/30  鈴木  A



(それぞれのシートに100個ぐらいのリスト)

Sheet2
ID 日付     名前  達成度・・・
2 2010/10/17  佐藤  C
3 2010/10/20  中村  B




一覧シート
ID 日付     名前  達成度・・・
1 2010/10/17  山田  A
2 2010/10/18  佐藤  C
3 2010/10/20  中村  B
4 2010/10/30  鈴木  A


A 回答 (3件)

 横から失礼します。



>やはり関数では難しいですか・・・

 作業用シートと併用すれば、関数でも可能です。

 まず、例えば

作業用シート

という名称のシートを設けて下さい。
 次に、作業用シートのA列に、

A1セル  Sheet1
A2セル  Sheet2
A3セル  Sheet3
A4セル  Sheet4
 ・    ・
 ・    ・
 ・    ・

という具合に、元リストが存在しているシートの名称を、入力して下さい。
 この時、シート名を並べる順序は特に気にされなくても結構ですが、同じ名称を重複して入力する事はなさらないで下さい。(途中に空欄や、存在しないシート名が入力されていても、そのシート名を無視して、処理する事が可能です)
 次に、作業用シートのC1セルに、次の数式を入力して下さい。

=IF(ISERROR(INDIRECT(INDEX($A:$A,MOD(INT(ROW()-0.5),MATCH("/",$A:$A,-1))+1)&"!IV65536")),"",IF(ISNUMBER(INDIRECT(INDEX($A:$A,MOD(INT(ROW()-0.5),MATCH("/",$A:$A,-1))+1)&"!A"&INT((ROW()-0.5)/MATCH("/",$A:$A,-1))+1)),INDIRECT(INDEX($A:$A,MOD(INT(ROW()-0.5),MATCH("/",$A:$A,-1))+1)&"!R"&INT((ROW()-0.5)/MATCH("/",$A:$A,-1))+1&"C"&COLUMNS($A:A),0),""))

 次に、作業用シートのB1セルに、次の数式を入力して下さい。

=IF(ISNUMBER($C1),$C1+COUNTIF($C$1:$C1,$C1)/COUNTIF($C:$C,$C1),"")

 次に、作業用シートのB1~C1の範囲をコピーして、同じ列の2行目以下に、全ての元リストの行数の合計を、上回るのに充分な行数に、貼り付けて下さい。
 そして、作業用シートのC列全体をコピーして、C列よりも右にある列に貼り付けて下さい。(例えば、元リストがO列まである場合には、それよりも2列多い、Q列にまで貼り付けて下さい)

 次に、一覧シートの
A1セルに「ID」、
B1セルに「日付」、
C1セルに「名前」、
D1セルに「達成度」、
と入力して下さい。
 次に、一覧シートのA2セルに、次の数式を入力して下さい。

=IF(ROWS($1:1)>COUNT(作業用シート!$B:$B),"",VLOOKUP(SMALL(作業用シート!$B:$B,ROWS($1:1)),作業用シート!$B:$IV,COLUMNS(作業用シート!$B:C),0))

 次に、一覧シートのA2セルをコピーして、同じ行のA列よりも右にあるセルに貼り付けて下さい。(例えば、元リストがO列まである場合には、O列にまで貼り付けて下さい)

 次に、B2セルの書式設定の表示形式を、日付にして下さい。
 最後に、作業用シートの2行目をコピーして、3行目以下に貼り付けて下さい。

 これで準備は完了です。
 後は、作業用シートのA列に名称を入力した、各シートの元リストにデータを入力すると、そのデータが自動的に一覧シートに、ID順に表示されます。
    • good
    • 2
この回答へのお礼

ありがとうございます!!

すごい、関数でできるのですね。

ただ、やってみたところ私の作業用PCのスペックでは、再計算に
時間がかなりかかるようです。。

データが多いのでしょうがないですね。

やはりマクロで作成する方が後々を考えるとよいのかもしれません。。

お礼日時:2010/10/24 13:23

> マクロで行うとなると、どこかの(たとえば行の一番端のセル)の記入があった時に自動で実行されるというのが望ましいです。



ではそれはどの列にしたいのですか?

プログラムでは、一応D列ということにしました。
変えたいのであれば、
Col = "D"
をいじってください。

> IDは固有番号なので、複数記入されることはありません。

そういうことではなくて、人間が記入するんですよね?
ということは、誤記入も可能性を考えてプログラミングしなければなりませんよね?
でも、絶対にそのようなことは無いようなので、誤記入は無いものとしてマクロを作りました。

一覧シートのシート名は「一覧」にしてください。
違うものにしたい場合は、マクロの中の2箇所の「一覧」を変更してください。

また、一覧シートと、記入する複数のシート以外のシートは無いものとしています。
全然別のシートが有った場合、そのシートのD列に何かが記入されたら、マクロが走ってしまいます。

ThisWorkbookモジュールに、以下を書いてください。

ThisWorkbookモジュールとは何かは、調べてください。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Col As String
Col = "C"
If Sh.Name <> "一覧" Then
If Not Intersect(Target, Sh.Columns(Col)) Is Nothing Then
With Worksheets("一覧")
Target.EntireRow.Copy .Cells(.Rows.Count, Col).End(xlUp).Offset(1).EntireRow
.Range("A1").CurrentRegion.Sort Key1:=.Range("A2"), Order1:=xlAscending, Header:=xlYes
End With
End If
End If
End Sub
    • good
    • 2
この回答へのお礼

マクロをお教えいただきありがとうございました。
かなり不慣れなので、ひとつひとつ勉強しながら
教えていただいたものを活用させて頂きたいと思います。

お礼日時:2010/10/22 15:14

6シート程度からとなると、マクロでしょうね。


データを記入した後に、「コピー」「並べ替え」という作業をおこなうことになりますが、
マクロを実行するタイミングはいつですか?
記入者が記入後にマクロ実行ボタンを押す?
それとも、どこかの列が入力されたら、自動でマクロを実行?
入力データ数が決まっている(すべての欄を埋める)のであれば、すべてが埋まったら、自動でマクロを実行?

同じIDが複数記入された場合の処理は?
同じIDが複数記入されてはいけないから、そのときはエラー?
それとも、上書き?

この回答への補足

早速の回答誠にありがとうございます。
やはり関数では難しいですか・・・

補足致します。
>マクロを実行するタイミングはいつですか?
>記入者が記入後にマクロ実行ボタンを押す?
>それとも、どこかの列が入力されたら、自動でマクロを実行?
>入力データ数が決まっている(すべての欄を埋める)のであれば、すべてが埋まったら、自動でマクロを実行?

マクロで行うとなると、どこかの(たとえば行の一番端のセル)の記入
があった時に自動で実行されるというのが望ましいです。

>同じIDが複数記入された場合の処理は?
>同じIDが複数記入されてはいけないから、そのときはエラー?
それとも、上書き?

IDは固有番号なので、複数記入されることはありません。

補足日時:2010/10/22 13:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!