Aさん  Bさん
1日   ○    ●
2日   ●    ◇
:
31日  △    ○
合計   ?    ?

上のような表があり、○は8時間、●も8時間、△は6時間、◇は4時間と計算し、合計欄に数字がはいるような式を教えてください。記号はパターンが増えることもあり、そのたびに式をかえなくてもすむようにしたいです。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ご回答者と同じ、配列を使用して次の方法で如何でしょうか。


(1)合計関数
=SUM((COUNTIF(A1:An,シート2!$A$2:$A$n)*シート2!$A$1),COUNTIF(A1:An,シート2!$B$2:$B$n)*シート2!$B$1,COUNTIF(A1:An,シート2!$C$2:$C$n)*シート2!$B$1))
入力完了時、shift&ctrl&enterとして式が{}で囲まれるようにして下さい。

(2)別シートに記号と係数を作成
 A列 B列 C列
 8  6  4
 ○  △  ◇
 ●

記号が増減する場合は別シートを更新するだけですが、計算パターンが増える場合は計算式の追加が必要です。
    • good
    • 0
この回答へのお礼

これならできそうです。やってみます。

お礼日時:2005/04/29 10:00

私も他の方が回答されてます、配列数式が良いと思います。

(なるべくマクロを使わないという意味で)
ただ、

>そのたびに式をかえなくてもすむようにしたいです..

という事情であれば、関数をネストさせるよりVBAマクロでユーザー定義関数を作ってしまった方が楽かも。

この方法のメリットは、メンテナンス性が良いことです。記号を追加する場合は、組み込み関数による方法では数式の入ったセル全て修正が必要ですが、ユーザー定義関数の場合、VBAマクロのコードを修正するだけで済みます。
デメリットは、マクロを使用することです。

サンプルコードを挙げておきます。ご参考までに。

標準モジュールに貼り付けて、通常のワークシート関数のように使用します。

EX) =MarkSum(A2:A32)


Function MarkSum(TargetArea As Range)

  Dim Buf, tmp
  Dim rngCel As Range
  
  Buf = 0
  For Each rngCel In TargetArea
    Select Case rngCel.Value
      '記号と値を対応させる部分
      '記号を増やすなら同様に追加して下さい
      Case Is = "○": tmp = "8:00"
      Case Is = "●": tmp = "8:00"
      Case Is = "△": tmp = "6:00"
      Case Is = "◇": tmp = "4:00"
      'どれにも該当しなければゼロ
      Case Else: tmp = 0
    End Select
    Buf = Buf + CDate(tmp)
    tmp = 0
  Next rngCel
  MarkSum = Buf

End Function
    • good
    • 0
この回答へのお礼

ちょっと私にはむずかしそうです。参考にします。ありがとうございました。

お礼日時:2005/04/29 09:57

A2~A32まで1日~31日が、AさんがB1に入力されているとして、B33に以下の式を入力し、SHIFT+Crtlを押しながら、ENTERキーを押します。



=SUM((B2:B32="○")*8+(B2:B32="●")*8+(B2:B32="△")*6+(B2:B32="◇")*4)

式の両側に{=SUM・・・}となったら、OKです。
以下、Bさんはその式をコピーしC33に貼り付けていきます。
    • good
    • 0
この回答へのお礼

参考にします。ありがとうございました。

お礼日時:2005/04/29 09:58

記号が変わらないなら,


=SUM(IF(A2:A32="○",8,IF(A2:A32="●",8,IF(A2:A32="△",6,IF(A2:A32="◇",4,0)))))
このような式を入れて Shift+Ctrl+Enterを押すと配列数式として計算され、合計が出ます。

ところが、お望みの
>記号はパターンが増えることもあり、そのたびに式をかえなくてもすむようにしたいです。
を実現するには、別に記号の一覧表を作っておかなければなりません。これは、やや複雑です。

シートを3つ用意します。
Sheet1は、ご質問のものです。
Sheet2のA列とB列に、記号の一覧表を作ります。
○ 8
● 8
△ 6
◇ 4
Sheet3に、記号を数字に置き換えたものを求めます。
=VLOOKUP(Sheet1!A2,$A:$B,2,FALSE)
これをA2に入れ、たとえばA2~N32など、日数分・人数分の範囲にコピーします。

Sheet1上に戻り、Sheet3の合計を求めます。
=SUM(Sheet3!A2:A32)

この回答への補足

ちなみに、表にはなんにも記号がないところがあります。つまり、ブランクは0で計算したいのです。
教えていただいた数式ではエラーがでるので、どうしたらいいですか?

補足日時:2005/04/24 19:20
    • good
    • 0
この回答へのお礼

参考になりました。
式をかえないでやるには、複雑なほうでないとだめですね。試してみたいと思います。

お礼日時:2005/04/24 18:23

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


人気Q&Aランキング

おすすめ情報