• ベストアンサー

エクセルで延人員数を数えたいです

A列に出動日、B列に出動した人の名前が入っています。 総出動日数に要した延人員数を求めたいです。 同一日に3名で出動した場合は、「3」と数えます。 同一日に同じ人が、2回出動した場合は、「1」と数えます。 (例) A列    B列 3月15日 山田 3月15日 田中 3月18日 山田 3月18日 山田・田中・高橋 ↑これを「5」と数えたいのです。 何か良い方法があったら、教えてください。 よろしくお願いいたします。

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

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

分かり易くデータが多くても計算に負担とならない方法は作業列を作って対応することです。 例えば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名以上になる場合でも同じように対応することができますね。

wensleydale
質問者

お礼

回答ありがとうございました。 区切り位置指定ウィザードで、セルを分割し、名前の列の横にそれぞれ日付用の列を挿入して、A列からコピペして、 A列日付、B列名前、C列日付、D列名前、E列日付・・・ CD列を名前の昇順で並べ替える。 EF列を名前の昇順で並べ替える。・・・ として、日付と名前が両方入っているセルが上に集まっているので、それらのセルをAB列にコピペ。 AB列をデータツールの「重複の削除」をクリックで数えられるような気がしてきました。 なるべく長い式は使いたくないので、せっかく教えていただいた関数を使わずスマートではないですが。 会社のパソコンで、本来のデータを使っても出来るか、明日試してみようと思います。 ありがとうございました。

その他の回答 (4)

回答No.5

一日2回まででA列昇順なら 「・」中点の区切り位置でセルを分割させる F2セルに =IF(B2="",0,IF($A1=$A2,ISNA(MATCH(B2,$B1:$D1,0))*1,1)) 右へ下へオートフィル その範囲をSUMで合計 =SUM(F2:H5) 根本的な入力の方法(フォーマット)を変えたほうがよいと思います。

wensleydale
質問者

お礼

回答ありがとうございました。 確かにカウントするためには、入力の方法が良くないですが、もともとある別のために作っているデータを転用したかったので、入力方法を変えるのは難しいのです。 質問の仕方が下手でした。すみません。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

>何か良い方法があったら、教えてください。  ⇒これはマクロ(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

wensleydale
質問者

お礼

回答ありがとうございました。 マクロは全くわからないので、もっとアナログな方法を探します・・・。

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.2

ちょっと修正 セルA2は =NOT(SUMPRODUCT((Sheet1!$A$1:$A1=Sheet1!A2)*(Sheet1!$B$1:$D1=Sheet1!B2)))*(Sheet1!B2<>"") でした

  • web2525
  • ベストアンサー率42% (1219/2850)
回答No.1

一度の計算式のみで数えるのは無理と思われます [山田・田中・高橋] のように一つのセル内に・区切りで複数の人名入力されている部分も計算式での処理上で非常に厄介です 出勤の細かなルールによっても計算式は変化しますが、例にあげられている表の集計だけであれば 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)で合計を出せば集計可能です 計算式の範囲は元のデータにあわせて変更する必要が有ります

wensleydale
質問者

お礼

迅速な回答ありがとうございました。 SUMPRODUCTという関数を初めて見たので、数日間クラクラしていてお礼も出来ませんでした。 すみません。 今度、ゆっくり勉強します。 ありがとうございました。

関連するQ&A