• ベストアンサー

Excelで工数、勤怠管理、何月何日に誰がどこへ

Excel2010を使っています。「何月何日に誰がどこへ行ったのか」がわかる表を作ろうとしていますが、うまく作れません。 Sheet1に以下のようなデータを作り、       鈴木 山田 田中 4月1日 新宿 新宿 横浜 4月2日 新宿 横浜 横浜 4月3日 新宿 渋谷 新宿 Sheet2のA1に「新宿」と入力したら、Sheet1を参照して、 新宿  4月1日 4月2日 4月3日 鈴木    1.0    1.0    1.0 山田    1.0 田中               1.0 と出力されるようにしたいのです。 http://okwave.jp/qa/q5829569.html?&status=true&errcode=&msg=&qid=5829569 を参考に、 INDIRECT、SMALL、ROW等の関数を使ってやってみましたが、うまくいきません。 できれば、ピボットテーブル、関数を使って作りたいです。 無理ならば、VBAを考えています。 どなたか詳しい方がいれば教えてください。よろしくお願いします。

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

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

回答No1です。 下記の文章を訂正してください。 K2セルには次の式を入力して下方にドラッグコピーします。 =IF(OR(B$1="",$A2=""),"",B$1&B2&$A2) これ式をK2セルに入力した後で横方向にドラッグコピーしたのちに下方向にもドラッグコピーします。に訂正してください。

その他の回答 (4)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.5

ついでに関数。 (例題見る限りSheet1とSheet2の位置関係を行列入れ替えれば良いだけのように見えるので) Sheet1のデータがA1から始まってるとして。 これもまず「名前定義」で 「名前」に database 「参照範囲」に =INDEX($A:$A,COUNTA($A:$A)+1):INDEX($1:$1,COUNTA($1:$1)+1) Sheet2のB1セルに =INDEX(database,COLUMN(),1) 右に必要データ列数コピー。 A2セルに =INDEX(database,1,ROW()) 下に必要データ行数分コピー。 B2セルに =($A$1=INDEX(database,COLUMN(),ROW()))*1 右と下に必要データ行列数分コピー。 #Sheet1とSheet2の並びを行列入れ替えず、そのままで妥協できるならもっと簡単?

excel_march
質問者

お礼

ありがとうございます。 改めて、いろいろなやり方があるのだなと思いました。Excelは深いです。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

>できれば、ピボットテーブル、...を使って作りたいです。 という点に反応してみました。 Sub test()   ActiveWorkbook.Names.Add "database", "=INDEX($A:$A,COUNTA($A:$A)+1):INDEX($1:$1,COUNTA($1:$1)+1)"   ActiveWorkbook.PivotCaches.Add(xlConsolidation, "database").CreatePivotTable("").AddFields "列", "行", "値" End Sub データ範囲が拡張しても対応できるように「名前定義」を設定して、 [Alt][d][p]でConsolidation Type のピボットテーブルを作成するマクロです。 試す場合は、データが在るSheet1をアクティブにして実行してください。 Sheet1のデータはA列に日付、1行目に担当者、かつA1セルはデータが何も入力されていない事が前提です。 手作業の場合 1)データが在るSheet1をアクティブにして[ctrl]+[f3]、「名前の管理」「新規作成」、  「名前」に database 「参照範囲」に =INDEX($A:$A,COUNTA($A:$A)+1):INDEX($1:$1,COUNTA($1:$1)+1)  で[OK]。  (A1セルに項目名がある場合は =INDEX($A:$A,COUNTA($A:$A)):INDEX($1:$1,COUNTA($1:$1)) で良いです) 以上が可変範囲の名前定義。 2)[Alt][d][p]で「ピボットテーブルウィザード」、「複数のワークシート範囲」にチェックして[次へ] 3)「指定」にチェックして[次へ] 4)「範囲」に database [追加]、[完了] 5)できたピボットテーブル「列ラベル」の列フィールドを「行ラベル」へ。「行ラベル」の行フィールドを「列ラベル」へ。 6)「フィールドリスト」から値フィールドを「レポートフィルター」に追加する。 ..な流れでできます。 あとは体裁を整えればなんとかなるかと。

excel_march
質問者

お礼

ありがとうございます。 ピボットテーブルすごいです! 毎月毎月SUMやIF関数使ってた自分がバカらしく思えてきました。とにかくデータ入力だけは毎日しっかりやっていきます。ピボットテーブルはいつでも作成できますし。もっと極めたいと思いました。

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

こんにちは! 関数での方法は回答されていますので、VBAでの一例です。 まずAlt+F11キー → メニュー → 挿入 → 「標準モジュール」 → VBE画面に ↓のコードをコピー&ペーストしておいてください。 Sub 表示() 'この行から Dim i As Long, j As Long, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") Application.ScreenUpdating = False i = wS2.Cells(Rows.Count, 1).End(xlUp).Row If i > 1 Then wS2.Rows(2 & ":" & i).ClearContents End If j = wS2.Cells(1, Columns.Count).End(xlToLeft).Column If j > 1 Then Range(wS2.Cells(1, 2), wS2.Cells(1, j)).ClearContents End If i = wS1.Cells(Rows.Count, 1).End(xlUp).Row Range(wS1.Cells(2, 1), wS1.Cells(i, 1)).Copy wS2.Activate wS2.Cells(1, 2).Select Selection.PasteSpecial Paste:=xlAll, Transpose:=True j = wS1.Cells(1, Columns.Count).End(xlToLeft).Column Range(wS1.Cells(1, 2), wS1.Cells(1, j)).Copy wS2.Activate wS2.Cells(2, 1).Select Selection.PasteSpecial Paste:=xlAll, Transpose:=True For i = 2 To wS1.Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" And wS1.Cells(i, j) = wS2.Cells(1, 1) Then wS2.Cells(j, i) = 1 End If Next j Next i Application.ScreenUpdating = True wS2.Cells(1, 1).Select End Sub 'この行まで 次に画面左下のSheet2のSheet見出し上で右クリック → コードの表示 → VBE画面に ↓のコードをコピー&ペーストしてSheet2のA1セルデータを入力してみてください。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Target.Address = "$A$1" Then Call 表示 End If End Sub 'この行まで こんなんではどうでしょうか?m(_ _)m

excel_march
質問者

お礼

ありがとうございます。 言われたとおりにやったらできました! 生まれて初めて実行したVBAです。これからは、この内容がわかるよう一行一行、理解していきたいです。

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

最も分かり易くデータが多くなっても計算に負担がかからない方法は作業列を作って対応することです。 シート1の1行目ではB1セルから横に名前が入力されており、例えばJ1セルまで入力されているとします。また、A2セルから下方には日付が入力されているとします。 K2セルには次の式を入力して下方にドラッグコピーします。 =IF(OR(B$1="",$A2=""),"",B$1&B2&$A2) シート2にはA1セルに新宿とかの検索する場所を入力し、B1セルから横方向には日付が入力されているとします。 また、A2セルから下方には名前が入力されているとします。 作成するとしてA2セルから下方には日付を入力し、B1セルから横の列には氏名を入力するとします。 B2セルには次の式を入力して右横方向にドラッグコピーしたのちに下方にもドラッグコピーします。 =IF(COUNTIF(Sheet1!$K:$Z,$A2&$A$1&B$1)=0,"",COUNTIF(Sheet1!$K:$Z,$A2&$A$1&B$1)) 作業列をK列にしていますが人数に応じてより右の列にしてもよいでしょう。その場合にはB2セルへの入力の式も当然変わりますが応用してください。 このように作業列を作ることで簡単にしかも計算に負担を掛けることもなく処理することができます。

excel_march
質問者

お礼

本当にありがとうございます! 質問から36分後にはもう回答が。 お礼が遅くなったのは、もっと違う回答が出るのではという不純な動機からでした。申し訳ありません。 この場を借りて回答してくださったお三方、本当にありがとうございました。Excelはすごいです! それを使いこなしている方々はもっとすごいです! 少しでも近づけるよう勉強していきます。ありがとうございました!

関連するQ&A

  • Excelの2つのシートのデータ-を。。。。。

    1つのシートには 鈴木さん  住所・・・・ 山田さん  住所・・・・ 田中さん  住所・・・・ というリストが3000人分ほど入っています 別のシートには 鈴木さん  りんご 鈴木さん  とまと 鈴木さん  みかん 山田さん  りんご 田中さん  いちご 田中さん  とまと 田中さん  りんご 田中さん  みかん と、言った感じで同じ人物が縦書きで複数回登場します 実際はフルネームなので別人が重なることはありません で、です。 別のシートでも1枚目のシートにでもいいのですが 鈴木さん  住所・・・   3 山田さん  住所・・・   1 田中さん  住所・・・   4 と、列に2枚目のシートでの登場回数を反映させたいのです。 なにせ3000件あまり、手作業ではなく、関数を使ってする方法はないでしょうか、、、 もう少し欲張ると             りんご とまと みかん いちご  鈴木さん 住所 3    1  1   1 山田さん 住所 1       1 田中さん 住所 4    1  1   1   1 ってな事は、できませんか。    

  • エクセル 最新日付以外のデータを合計する

    下表があるとしまして、 氏名 日付 買上金額 鈴木 5月5日 10 鈴木 5月6日 60 鈴木 5月7日 100 鈴木 5月9日 400 田中 5月4日 100 田中 5月7日 200 山田 5月1日 600 山田 5月2日 200 山田 5月3日 300 1970 氏名毎に、最新日付以外の合計を計算したいのです。 この場合、鈴木さんが170 田中さんが100 山田さんが800の合計1070がそれぞれの氏名の最新以外データの合計となりますが、これらを自動的に計算できないでしょうか? よろしくおねがいします。

  • Excel(2010)で氏名の頻度の求め方

    Excel(2010)で、A列に縦に 山田 鈴木 田中 山田 鈴木 山田 というように氏名の並べてある表があるとします。この表で氏名の頻度が 山田 3 鈴木 2 田中 1 というように表示できる関数または方法があるでしょうか。 この表のように項目が少なければ 山田 鈴木 田中 というセルを作っておいて、VLOOKUP関数で求められますが、実際には約500行ありその中の氏名をすべて手作業で入力するのは大変ですので、重複なくすべての氏名を抜き出すのは実際的ではありません。 以上よろしくお願いします。

  • 関数で困ってます

    時間割を早く作りたいのですが、このような場合はどうしたらいいのでしょうか? 例 シート1は     1    2   3  田中1-1 1-2 1-3 伊藤1-2 1-3 1-4  山田1-3 1-4 1-1 鈴木1-4 1-1 1-2 シート2に      1  2  3 1-1 田中 伊藤 山田 1-2 伊藤 山田 鈴木 1-3 山田 鈴木 田中 1-4 鈴木 田中 伊藤 シート2の氏名のところがシート1を元に検索できないでしょうか? 誰かたすけてくれませんか?

  • エクセルのマクロについて

    パソコン初心者です。 たとえば シート1のA1に「田中」と入力する。 ボタンを押すとシート2のA1に「田中」と表示される。 次にシート1のA2に「山田」と入力する。 ボタンを押すとシート2のA1に「山田」と表示される。 次にシート1のA3に「鈴木」と入力する。 ボタンを押すとシート2のA1に「鈴木」と表示される。 このようにマクロを組むにはどのようにしたらよいのでしょうか? わかりにくくてすいません。

  • Excelの関数である月ごとの合計数を調べたい

    Excelの関数である月ごとのの登録数を調べたいのですがsheet2のB列にどのような関数を入れればよいでしょうか?ちなみにsheet1のA列は日付の書式です。 sheet1 A    |B 2004/3/1|山田 2004/3/2|鈴木 2004/4/2|金村 sheet2 A    |B 2004/3 | 2004/4 | 2004/5 |

  • エクセルで2つの条件を元に

    エクセル2007で名簿を作っています。 1ヶ月ごとにメンバーの順が変わります。 シート1(番号順に名簿を作りました)   A  B   C  1 1     山田 2 2     木村 3 3 副長 佐藤 4 4     鈴木 5 5 班長 田中 6 6     長田  シート2(こちらがメンバーに配る名簿です)   A   B  C   D 1 班長    1    3 2 田中    山田  鈴木 3 4 副長    2    4 5 佐藤    木村  長田 A2に田中,A5に佐藤を選んでくるのはvlookupで成功しました。 質問したいのは C列D列に上記の番号のようにシート1の名前を入れていきたいのですが,田中,佐藤の分を抜いた上で番号の若い順に選んできたいのです。 どのような関数をどのように使えば成功するでしょうか。  

  • 複数のシートのセル内容をひとつにまとめたい

    複数のシートのセル内容をひとつにまとめたいと思っています。 Sheet1        Sheet2      Sheet3 1 山田 ¥100  1 山田 ¥80  3 鈴木 ¥80 2 佐藤 ¥130  2 佐藤 ¥55  4 田中 ¥150 3 鈴木 ¥110  4 田中 ¥60 こんなデータを Sheet4 1 山田 2 佐藤 3 鈴木 4 田中 とまとめたいんです。 金額は必要ないので、番号と名前だけをまとめたいんです。 どうすれば良いか、教えてください。 よろしくお願いします。

  • (エクセル)INDEX、MATCHで全候補を反映

    初歩的な質問かもしれませんが、エクセル関数で分からないことがありましたので、教えてください。 sheet1のD8で以下の関数を入力しています。 =INDEX(Sheet2!$C$15:$C$500,MATCH(SUM(E8:P8),Sheet2!$AQ$15:$AQ$500,0)) (E8:P8にもデータ入力されています。) sheet1のD9には =INDEX(Sheet2!$C$15:$C$500,MATCH(SUM(E9:P9),Sheet2!$AQ$15:$AQ$500,0)) といった感じで、D8から下に同じ内容の関数を入力しています。 ここで、SUM(E8:P8)、SUM(E9:P9)、SUM(E10:P10)が同じ値だと、候補が複数あるにも関わらず、一つの候補がD8、D9、D10に入力されてしまいます。 例えば、人の名前であれば、D8:山田、D9:田中、D10:鈴木となってほしいところ、D8~D10で山田という結果になります。 山田、田中、鈴木ともに同じデータを持っているので、複数の条件で縛ろうとしても良い案が思いつきませんでした。 ROWで何とかできないかと試行錯誤しましたが、よく分かりませんでした。 出来ることならば、VLOOKUPなど他の関数ではなく、INDEX、MATCH関数で組み立てられたらうれしいです。 また、D8:鈴木、D9:山田、D10:田中といったように同じデータを持っているもの同士では順番はどのようになってもいいのですが、出来ることならsheet2で上の行から順番に入力されているどおりにD8~D10にも反映されていた方がいいです。 分かる方いましたら教えてください。 よろしくお願いします。

  • excelでできますか?

      1/1月   1/2火   1/3水   1/4木   1/5金 山田 ○   △    ○    △   × 田中 ○   ×    ×    ○   △ 鈴木 △   △    △    ×   × の様な表で 山田 ○  1/1月 1/3水  △  1/2火 1/4木 ×  1/5金 の様に個人の集計をとるようなこと、できますか?

専門家に質問してみよう