- 締切済み
エクセルの表に新しいデータを追加していきたい
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- bunjii
- ベストアンサー率43% (3589/8249)
元データが処理し難い状態なので、作業用にSheer2を使ってみました。 Sheet1の参加者名が入力されたセル(B6:F9)に重複データを除いた情報を抽出します。 Sheet2!B6=IF(Sheet1!B6="","",IF(COUNTIF(Sheet1!$A$5:A6,Sheet1!B6)>0,"",COLUMN()*10000+ROW())) これを右側と下の必要範囲へオートフィルでコピーします。 次に、Sheet2のA6へ次の式をセットして重複しない参加者名を抽出します。 Sheet2!A6=IFERROR(INDEX(Sheet1!$A$1:$F$100,MOD(SMALL($B$6:$F$100,ROWS($6:6)),10000),INT(SMALL($B$6:$F$100,ROWS($6:6))/10000)),"") Sheet2のA6を必要なセルまで下へコピーすれば作業用テーブルが完成です。 Sheet1のB22へは次の式をセットします。 B22=IF(AND(B$5=B$21,COUNTIF(B$6:B$9,Sheet2!$A6)>0),Sheet2!$A6,"") これを右側と下へ目的のセルまでコピーすればご提示の一番下の表と同じになります。 添付画像はExcel 2013で作成しましたがExcel 2010でも同等に処理できると思います。
- kagakusuki
- ベストアンサー率51% (2610/5101)
一度入力したコメントを残すのでしたら、コメントの入力方法を少々変更して、以下の様な方法にされては如何でしょうか? 今仮に、参加者データの表の内、12月1日と入力されているセルがSheet1のB5セルであるものとします。 それから、関数を使って、参加者データを基にしてSheet2のA列に日付を(参加者人数分だけ間隔をおいて)昇順で表示すると共に、条件付き書式を使って日付ごとの区切りも自動的に線引きされる様にし、B列にその日付ごとの参加者名を表示する様にしますので、Sheet2のC列に、その日付における参加者毎にコメントを入力する様にします。 そして、当日の参加者リストに関しては、Sheet3のA1セルに日付を入力すると、Sheet3のA列とB列に、指定した日付における参加者名とコメントが、Sheet2のデータから抽出されて表示される様にする様にします。 それと、Sheet4のA列を作業列として使用して、Sheet5に参加者リストを表示する様にします。 文章で説明しただけでは解り難いかと思いますので、下の添付画像も合わせて参考にして下さい。 尚、添付画像において、青い色の文字と青い色の枠線の部分が、関数や条件付き書式によって自動的に表示された箇所です。 その設定方法は以下の通りです。 まず、Sheet2のA3セルに次の関数を入力して下さい。 =IF(COUNT(A$2:INDEX(A:A,ROW()-1))<COUNT(Sheet1!$5:$5),IF(OR(ROW()=ROW(A$2)+1,ISNUMBER(1/(ROW()-MATCH(9E+307,A$2:INDEX(A:A,ROW()-1))=MATCH(CHAR(1),OFFSET(INDEX(Sheet1!$5:$5,MATCH(LOOKUP(9E+307,A$2:INDEX(A:A,ROW()-1)),Sheet1!$5:$5,0)),1,,ROWS(A:A)-ROW(Sheet1!$5:$5)),-1)+1))),SMALL(Sheet1!$5:$5,COUNT(A$2:INDEX(A:A,ROW()-1))+1),""),"") 次に、Sheet2のB3セルに次の関数を入力して下さい。 =IF(COUNT($A$2:INDEX($A:$A,ROW())),OFFSET(INDEX(Sheet1!$5:$5,MATCH(LOOKUP(9E+307,$A$2:INDEX($A:$A,ROW())),Sheet1!$5:$5,0)),ROW()-MATCH(9E+307,INDEX($A:$A,1):INDEX($A:$A,ROW()))+1,)&"") 次に、以下の様な操作を行って、Sheet2のA3~C3のセル範囲に条件付き書式を設定して下さい。 Sheet2のA3セルを選択 ↓ Excelウィンドウの[ホーム]タブをクリック ↓ 現れた「スタイル」グループの中にある[条件付き書式]ボタンをクリック ↓ 現れた選択肢の中にある[ルールの管理]をクリック ↓ 現れた「条件付き書式ルールの管理」ダイアログボックスの[新規ルール]ボタンをクリック ↓ 現れた「新しい書式ルール」ダイアログボックスの「ルールの種類を選択して下さい」欄の中にある[数式を使用して、書式設定するセルを決定]をクリック ↓ 現れた「次の数式を満たす場合に値を書式設定」欄の中に =$A3<>"" と入力 ↓ 「新しい書式ルール」ダイアログボックスの[書式]ボタンをクリック ↓ 現れた「セルの書式設定」ダイアログボックスの[罫線]タブをクリック ↓ 現れた[クリア]ボタンをクリック ↓ [罫線」欄の中にある上辺をクリックして、上辺が黒い実線、その他の3辺が薄い灰色となっている状態にする ↓ 「セルの書式設定」ダイアログボックスの[OK]ボタンをクリック ↓ 「新しい書式ルール」ダイアログボックスの[OK]ボタンをクリック ↓ 「条件付き書式ルールの管理」ダイアログボックスの「適用先」欄をクリック ↓ Sheet2のA3~C3のセル範囲をまとめて範囲選択 ↓ 「条件付き書式ルールの管理」ダイアログボックスの[適用]ボタンをクリック ↓ 「条件付き書式ルールの管理」ダイアログボックスの[OK]ボタンをクリック 次に、Sheet2のA3~C3の範囲をコピーして、同じ列範囲の4行目以下に貼り付けて下さい。 次に、Sheet3のA1セルの書式設定の表示形式を、[ユーザー定義]の "本日("m"月"d"日)の参加者" として下さい。 次に、Sheet3のA3セルに次の関数を入力して下さい。 =IF(ISNUMBER($A$1),IF(COUNTIF(Sheet1!$5:$5,$A$1),OFFSET(INDEX(Sheet1!$5:$5,MATCH($A$1,Sheet1!$5:$5,0)),ROWS($3:3),)&"",""),"") 次に、Sheet3のB3セルに次の関数を入力して下さい。 =IF(COUNTIF($A3:INDEX($A:$A,ROWS($A:$A)),"*?"),INDEX(Sheet2!$C:$C,MATCH($A$1,Sheet2!$A:$A,0)-1+ROWS($3:3))&"","") 次に、Sheet2のA3~C3の範囲に対して条件付き書式を設定した時と同様の操作を、Sheet3のA3~B3に対しても行い、「次の数式を満たす場合に値を書式設定」欄の中には、 =COUNTIF(OFFSET($A3,,,ROWS($A:$A)-ROW()+1),"*?") という数式を入力した上で、罫線の設定は4辺とも黒い実線となる様に、条件付き書式を設定して下さい。 次に、Sheet3のA3~B3の範囲をコピーして、同じ列範囲の4行目以下に貼り付けて下さい。 次に、Sheet4のA3セルに次の関数を入力して下さい。 =IF(AND(INDEX(Sheet2!$B:$B,ROW())<>"",COUNTIF(INDEX(Sheet2!$B:$B,ROW(Sheet2!$B$2)):INDEX(Sheet2!$B:$B,ROW()),INDEX(Sheet2!$B:$B,ROW()))=1),COUNT($A$2:$A2)+1,"") 次に、Sheet4のA3セルをコピーして、Sheet4のA4以下に貼り付けて下さい。 次に、Sheet5のA2セルに次の関数を入力して下さい。 =IF(COLUMNS($A:A)>COUNT(Sheet1!$5:$5),"",SMALL(Sheet1!$5:$5,COLUMNS($A:A))) 次に、Sheet5のA3セルに次の関数を入力して下さい。 =IF(ISNUMBER(1/COUNTIF(OFFSET(INDEX(Sheet1!$5:$5,MATCH(A$2,Sheet1!$5:$5,0)),1,,ROWS(A:A)-ROW(Sheet1!$5:$5)),INDEX(Sheet2!$B:$B,MATCH(ROWS($3:3),Sheet4!$A:$A,0)))),INDEX(Sheet2!$B:$B,MATCH(ROWS($3:3),Sheet4!$A:$A,0)),"") 次に、Sheet5のA2~A3範囲をコピーして、同じ行範囲のA列よりも右側にあるセル範囲に貼り付けて下さい。 次に、Sheet5の3行目全体をコピーして、4行目以下に貼り付けて下さい。 以上で準備は完了で、当日の参加者リストを表示させる際には、Sheet3のA1セルに日付を 2013/12/3 等の様な形式で入力して下さい。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
コメントを書き換えたり不参加者を削除したりせずに、どんどん蓄積していくことをお勧めします。 ●質問文の添付図の 2 つ目の表は、データを蓄積している表をフィルタで絞り込むことにより、簡単に表示できます。 ●質問文の添付図の 3 つ目の表は、別シートなどに必要な数式を記入して、データを蓄積している表から必要な値を持ってくることにより、表示できます。 下の添付図では、次のとおり記入しました。各日付は、セルの書式で「12月1日」やら「12/1」などと表示させることもできます。 E2 井上 F1 2013/12/1 F2 =iferror(index(sheet1!$B:$B,(sumproduct((sheet1!$A$2:$A$3000=F$1)*(sheet1!$B$2:$B$3000=$E2)*row(sheet1!A$2:A$3000))^-1)^-1),"") F2 セルをコピーして F2:J8 のセル範囲に貼り付け。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 外しているかもしれませんが・・・ ↓の画像(小さいと思いますので、拡大して確認してください)で 左側がSheet1で元データ・右側上がSheet2で日付毎の氏名表示・右側下がSheet3とします。 Sheet1・Sheet2の1行目(日付)はシリアル値であらかじめ入力済みだとします。 Sheet1はA列からデータがあり、Sheet2はB列からのデータになっているコトに注意してください。 Sheet2のA列は何も入力せず、空白のままにしておいてください。 Sheet1のデータをSheet2に表示する操作はVBAになってしまいます。 Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してください。 (Alt+F8キー → マクロ → マクロ実行です) Sub Sample1() 'この行から Dim i As Long, j As Long, endRow As Long, cnt As Long Dim c As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") '←「Sheet1」は実際のSheet名に! Set wS2 = Worksheets("Sheet2") '←「Sheet2」も実際のSheet名に! endRow = wS2.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 1 Then wS2.Rows(2 & ":" & endRow).Clear End If endRow = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(2, "A"), wS1.Cells(endRow, "A")).Copy wS2.Range("B2") With Range(wS2.Cells(2, "A"), wS2.Cells(endRow, "A")) .Formula = "=row()" .Value = .Value End With For j = 2 To wS1.Cells(1, Columns.Count).End(xlToLeft).Column For i = 2 To wS1.Cells(Rows.Count, j).End(xlUp).Row Set c = Range(wS2.Columns(2), wS2.Columns(j)).Find(what:=wS1.Cells(i, j), LookIn:=xlValues, lookat:=xlWhole) If c Is Nothing Then cnt = wS2.Cells(Rows.Count, "A").End(xlUp) wS2.Cells(cnt + 1, "A") = cnt + 1 wS2.Cells(cnt + 1, j + 1) = wS1.Cells(i, j) Else wS2.Cells(c.Row, j + 1) = wS1.Cells(i, j) End If Next i Next j wS2.Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous End Sub 'この行まで このマクロを実行するとSheet2に画像のように表示されますので、 このデータをSheet3に表示させます。 Sheet3のA1セルに最終日?の日付を入力するとその日の氏名がA列に表示されます。 (コメント列は手を付けていません) 画像ではSheet3のA4セルに =IFERROR(INDEX(OFFSET(Sheet2!$A$2:$A$1000,,MATCH(A$1,Sheet2!$1:$1,0)-1,,1),SMALL(IF(OFFSET(Sheet2!$A$2:$A$1000,,MATCH(A$1,Sheet2!$1:$1,0)-1,,1)<>"",ROW($A$1:$A$999)),ROW(A1))),"") これは配列数式になってしまいますので、Shift+Ctrl+Enterで確定! この画面からコピー&ペーストする場合は、上記数式をドラッグ&コピー → Sheet3のA4セルを選択 → 数式バー内に貼り付け → そのまま(編集可能なまま)Shift+Ctrlキーを押しながらEnterキーで確定! 数式の前後に{ }マークが入り配列数式になります。 これをオートフィルで下へコピー! これで画像のような感じになります。 ※ Sheet2への表示は数式でないので、データ変更があるたびにマクロを実行する必要があります。 ご希望の方法でなかったらごめんなさいね。m(_ _)m
お礼
ありがとうございます! エクセルVBAも配列数式も判りませんが、書いていただいた通りにやったらバッチリできました! ただ私にとってはオーバーテクノロジーの為、応用が効かないのが大変申し訳ございません(汗