『SUMに関する関数を教えてください』(Nancy)
はじめまして。
Excel初心者です。
次のようなSUMを出す関数があれば教えていただきたいです。
1)A1に「100(単位は円)」を入力
2)B1にA1の値100のうち1〜30には5%を掛け、次の31〜60には4%を掛け、61〜90に3%を掛けて、最後91〜100には2%を掛けたものを合計した値が入力される関数。
すなわち、B1には30×5%+30×4%+30×3%+10×2%=「3.8」という値が入力されるような関数があれば教えていただきたいです。
A1に入力した値を等差で分けて、最初の組に任意のパーセンテージを掛けて、次の組には先のパーセンテージより1%下のパーセンテージを掛けて…を繰り返して合算したものが欲しいです。
宜しくお願いいたします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
(私には具体的には組めませんけど) 考え方としては
MIN(MAX(A1-幅*回,),幅)*(率-回)% というのを 回=0から始めて INT(A1/幅) に達するまで繰り返し足す、って感じでしょうか...
SUM(
MIN(MAX(A1-幅*0,),幅)*(率-0)%
,MIN(MAX(A1-幅*1,),幅)*(率-1)%
,MIN(MAX(A1-幅*2,),幅)*(率-2)%
,MIN(MAX(A1-幅*3,),幅)*(率-3)%
・
・
)
(白茶) 2026/02/05(木) 18:06:56
具体的には、売上(A1)の売上手数料(B1)の計算になります。
売上(A1)の50万円ずつに7〜3%が掛かるようになっている仕組みです。
売上(A1)が120万円だった場合、A1に1200000を入力します。
すると手数料(B1)には「75000」が計算されるようにしたいのです。
※(1〜500000)×7%+(500001〜1000000)×6%+(1000001〜1200000)×5%
もし売上(A1)が150万円あれば、手数料(B1)は9万円になるのか、
という具合にA1だけを触ってB1が変動する関数があれば、と思いご質問させていただきました。
●白茶様
早速ありがとうございます。
そのようなイメージです!
(Nancy) 2026/02/05(木) 18:29:52
最後の3つの引数で調節
=LAMBDA(a,b,c, LET( div,ROUNDUP(a/b,0), vv,SCAN(0,SEQUENCE(div),LAMBDA(ac,v,MIN(b,a-b*(v-1)))), ratio,SCAN(c+1,SEQUENCE(div),LAMBDA(ac,v,ac-1)), SUM(vv*ratio/100)))(100,30,5) =>3.8
=LAMBDA(a,b,c, LET( div,ROUNDUP(a/b,0), vv,SCAN(0,SEQUENCE(div),LAMBDA(ac,v,MIN(b,a-b*(v-1)))), ratio,SCAN(c+1,SEQUENCE(div),LAMBDA(ac,v,ac-1)), SUM(vv*ratio/100)))(1200000,500000,7) =>75000 (まる2021) 2026/02/05(木) 18:58:46
補足的蛇足的な投稿で恐縮です。
ロジックは、まる2021さんはじめ既に回答いただいているものと概ね同じですが、 MAP関数を使った例を示してみます。
■ 以下の式は、LAMBDA関数を使って、自前の関数を定義したものです。 これを「名前」として登録しておきます。 ・ブックベースの名前にしてください。 ・名前は任意です。(commissionでもcostでも手数料でもなんでもよいです)
=LAMBDA(金額,単位金額,当初の適用率,
LET(
回数, CEILING(金額/単位金額, 1),
1〜回数の配列,SEQUENCE(回数),
区分金額, MAP(1〜回数の配列, LAMBDA(x, MIN(金額 - 単位金額*(x-1), 単位金額))),
率, MAP(1〜回数の配列, LAMBDA(x, 当初の適用率-(x-1))),
SUMPRODUCT(区分金額,率*0.01)
)
)
式に現れた変数は説明的な変数名にあえてしています。(却って理解しにくくなっているかも知れません) (なお、名前ボックスに一字一句手入力するのは非現実的です(入力域が狭すぎです)。 テキストエディタなりでコピーして、それを"参照範囲"のボックスに貼り付けるのがよいでしょう。 また、投稿の便宜上、式の始めにスペースを入れていますが、 名前登録にあたっては、スペースを入れずに、=で始めて下さい。)
■
利用するときは、以下のようにします。
A列 B C D列
1 100 30 5 =cost(A1,B1,C1) # 3.8が返ります
2 1,200,000 500,000 7 =cost(A2,B2,C2) # 75,000が返ります
■ 式の理解のためには、こんな式を入れてみると役立つかもしれません。 (こちらを先に説明するべきだったかも)
A列 B列 C列 D列 E列 F列
1 100 30 5
2
3 4 1 30 5
4 2 30 4
5 3 30 3
6 4 10 2 3.8
7
A3: =CEILING(A1/B1,1)
B3: =SEQUENCE(A3)
C3: =MAP(B3#,LAMBDA(x,MIN(B1,A1-B1*(x-1))))
D3: =MAP(B3#,LAMBDA(x,C1-(x-1)))
F6: =SUMPRODUCT(C3#,D3#/100)
C3やD3やF6にある B3# の#は"スピル範囲演算子"と呼ばれるもので、 そのセル範囲にある数式で生成されたスピル範囲を指します。 B3#は、この場合、B3:B6と同等です。(スピル範囲が変化すると動的に範囲が追随します。)
MAP関数の働きは、ヘルプを読んで下さい。 (既に回答がありましたSCAN関数とか、REDUCE関数やMAP関数は関数型言語でよく出てくる典型的なものです。)
これをLET関数を使ってひとつにまとめたものが、最初の式です。 (xyz) 2026/02/06(金) 17:36:43
一番最初の
>B1には30×5%+30×4%+30×3%+10×2%=「3.8」という値が入力されるような関数 であれば、
=SUMPRODUCT(A1*{0.3;0.3;0.3;0.1}*{0.05;0.04;0.03;0.02}) とかも。
まぁ小数点以下の端数処理はまったく考慮してないですけど。
(純丸) 2026/02/06(金) 20:18:45
純丸さん、横からすみませんが、 その案はA1が110であったり、80であったりしても有効なのでしょうか。 (xyz) 2026/02/06(金) 21:33:48
xyzさん A1に2つの配列を掛け合わせてそれを合算する数式です。 A1が変化しても有効です。
実際には別セルにテーブル(例:E1〜F4)を用意して、
A列 B列 C列 D列 E列 F列
1 100 3.8 0.3 5%
2 0.3 4%
3 0.3 3%
4 0.1 2%
B1セル =SUMPRODUCT(A1*($E$1:$E$4)*($F$1:$F$4)) のようにした方がメンテナンスにしても実用的だと思います。 =SUMPRODUCT(A1*$E$1:$E$4*$F$1:$F$4)のように中の括弧は無くてもいいのですが、 括弧があった方が見やすいので私は付けるようにしています。 (純丸) 2026/02/06(金) 22:38:11
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.