- ベストアンサー
エクセルで延人員数を数えたいです
A列に出動日、B列に出動した人の名前が入っています。 総出動日数に要した延人員数を求めたいです。 同一日に3名で出動した場合は、「3」と数えます。 同一日に同じ人が、2回出動した場合は、「1」と数えます。 (例) A列 B列 3月15日 山田 3月15日 田中 3月18日 山田 3月18日 山田・田中・高橋 ↑これを「5」と数えたいのです。 何か良い方法があったら、教えてください。 よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
分かり易くデータが多くても計算に負担とならない方法は作業列を作って対応することです。 例えばA列とB列の2行目から下方にデータがあるとして、また、B列では作業グループには5名までが記載されるとします。 初めにB列を選択してからエクセル2010の場合ですが「データ」タブから「区切り位置」を選択し「カンマやタブなど・・・」で「次へ」、区切り文字には「その他」で「・」を入力して「次へ」「完了」と操作します。この操作によって作業グループについては名前がB列からF列にわたって表示されるようになります。 G2セルには次の式を入力してK2セルまでオートフィルドラッグコピーしたのち下方にもオートフィルドラッグします。 =IF($A2="","",IF(B2="","",$A2&B2)) その後にL2セルには次の式を入力してP2セルまでオートフィルドラッグしたのちに下方にもオートフィルドラッグします。 =IF(G2="","",IF(COUNTIF($G$2:G2,G2)=1,1,"")) 最後に答えをC1セルに表示させるのでしたらC1セルに次の式を入力します。 =SUM(L:P) 作業グループが5名以上になる場合でも同じように対応することができますね。
その他の回答 (4)
- 某HN クロメート(Chromate)(@CoalTar)
- ベストアンサー率40% (705/1742)
- mu2011
- ベストアンサー率38% (1910/4994)
>何か良い方法があったら、教えてください。 ⇒これはマクロ(VBA)以外で計数する事は困難です。 仮に日付と出勤者が対になるように設定されていたら「フィルタオプションの設定」→「重複レコードを無視する」の抽出で可能ですのでご検討下さい。 マクロ例です。 対象シートタブ上で右クリック→コードの表示→以下のコードを右画面上段に貼り付け→F5キーを押下して見て下さい。 Sub sample() Set d = CreateObject("Scripting.Dictionary") For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row wk = Split(Cells(i, "B"), "・") For j = 0 To UBound(wk) d(Cells(i, "A") & wk(j)) = 1 Next Next MsgBox "総延べ人数=" & d.Count End Sub
お礼
回答ありがとうございました。 マクロは全くわからないので、もっとアナログな方法を探します・・・。
- web2525
- ベストアンサー率42% (1219/2850)
ちょっと修正 セルA2は =NOT(SUMPRODUCT((Sheet1!$A$1:$A1=Sheet1!A2)*(Sheet1!$B$1:$D1=Sheet1!B2)))*(Sheet1!B2<>"") でした
- web2525
- ベストアンサー率42% (1219/2850)
一度の計算式のみで数えるのは無理と思われます [山田・田中・高橋] のように一つのセル内に・区切りで複数の人名入力されている部分も計算式での処理上で非常に厄介です 出勤の細かなルールによっても計算式は変化しますが、例にあげられている表の集計だけであれば 1.B列のデータを[ツール]⇒[区切り位置]から・を区切り記号として1名前1セルとしてデータを分ける 2.元データ範囲と同じサイズの作業領域を利用 上記2点の条件付ですが、方法が無いわけではない 作業領域を別シートに置き A1セル=COUNTA(Sheet1!B1:D1) A2セル=NOT(SUMPRODUCT((Sheet1!$A1:$A1=Sheet1!A2)*(Sheet1!$B$1:$D1=Sheet1!B2)))*(Sheet1!B2<>"") と入力 A2セルの計算式をA2:C4範囲までドラッグしてコピー 後はSUM(A1:C4)で合計を出せば集計可能です 計算式の範囲は元のデータにあわせて変更する必要が有ります
お礼
迅速な回答ありがとうございました。 SUMPRODUCTという関数を初めて見たので、数日間クラクラしていてお礼も出来ませんでした。 すみません。 今度、ゆっくり勉強します。 ありがとうございました。
お礼
回答ありがとうございました。 区切り位置指定ウィザードで、セルを分割し、名前の列の横にそれぞれ日付用の列を挿入して、A列からコピペして、 A列日付、B列名前、C列日付、D列名前、E列日付・・・ CD列を名前の昇順で並べ替える。 EF列を名前の昇順で並べ替える。・・・ として、日付と名前が両方入っているセルが上に集まっているので、それらのセルをAB列にコピペ。 AB列をデータツールの「重複の削除」をクリックで数えられるような気がしてきました。 なるべく長い式は使いたくないので、せっかく教えていただいた関数を使わずスマートではないですが。 会社のパソコンで、本来のデータを使っても出来るか、明日試してみようと思います。 ありがとうございました。