エクセルで、源泉税額を計算する part2


源泉徴収月額表 には、甲と乙があります。乙は、2ヶ所以上のところから収入があって、主たる給与で無い場合の税額表です。これについては、電子計算機での計算法は定められておらず、あくまで税額表の数字の通り徴収するようになっています。
 そこで、税額表と同じ数字が出るように、その計算法が別の資料で配布されています。1000円・2000円・3000円と、給与額によってランクが異なり、そのランクの最小値で計算させるため、「基準値」という数値を求めるようになっています。さらに、上下にランク外の数字があり、この範囲については別計算することになっています。

月額表の乙欄を適用する給与等に対する税額の電算機計算について(平成19 年1 月以降分) によると

毎月の給与や賞与(以下「給与等」といいます。)に対する源泉徴収税額は、「給与所得の源泉
徴収税額表」によって求めることになっていますが、その給与等の支払額に関する計算を電子計算
機などの事務機械によって処理しているときは、月額表の甲欄を適用する給与等に限り、財務大臣
が定める方法(財務省告示)により、源泉徴収税額を求めることができる特例が設けられています。

一方、月額表の乙欄を適用する給与等については、月額表の甲欄を適用する給与等のような特例
は設けられていませんが、次の計算式を使用することにより、源泉徴収税額を求めることができま
す。

つまり、乙欄には特例が無いので、あくまで税額表の数字を使いなさい、それを計算機で求めるのなら、以下の方法があります・・ということです。そこで

[月額表の乙欄を適用する給与等に対する税額の電算機計算]
月額表の乙欄をみると「その月の社会保険料等控除後の給与等の金額」に応じて、@一定の算式
が掲げられている場合( 社会保険料等控除後の給与等の金額が88,000 円未満である場合と、
1,010,001 円以上である場合)と、A具体的な税額が掲げられている場合(社会保険料等控除後の給
与等の金額が88,000 円以上1,010,000 円以下である場合)とがあります。@の場合には、その該
当欄に掲げられている算式により、また、Aの場合には、次に掲げるところにより税額を計算し
ます。
1 計算基準額の算出
乙欄の税額は、月額表の「その月の社会保険料等控除後の給与等の金額」欄の最低値(税額表
の「以上」の欄の金額)を基として計算されていますので、まず、その月の社会保険料等控除後の
給与等の金額を次の算式によりこの最低値(以下「計算基準額」といいます。)に修正します。

ということで、88000円以上1009999円の間は、上の算式で基準値を求め、これを使って税額を計算します。

(注)1 「階差」は、次の表によって求めます。

その月の社会保険料控除語の金額(A)

階差

以上

以下

88,000円 

98,999円 

1,000円

99,000円 

220,999円 

2,000円

221,000円 

1,009,999円 

3,000円

2 「同一階差の最小値」とは、階差が 1,000 円の場合は88,000 円、階差が2,000 円の場合
は99,000 円、階差が 3,000 円の場合は 221,000 円をいいます。
3 その月の社会保険料等控除後の給与等の金額が1,010,000 円の場合は、前ページ1の(算式)に
よらず、1,010,000 円が求める計算基準額となります。

2 税額の算出
1により求めた計算基準額を次の算式に当てはめて税額を求めます。
(算式)
A=(計算基準額× 2.5−給与所得控除額−基礎控除額)×税率
B=(計算基準額× 1.5−給与所得控除額−基礎控除額)×税率
A−B=乙欄の税額
(注)1 上記の算式では、月額表の甲欄を適用する給与等に対する税額の機械計算を行う場合の表
(次ページの第1表から第3表)を使用します。
A及びBを求める算式中、「給与所得控除額」は、計算基準額を 2.5 倍又は 1.5 倍した
金額を基に次ページの第1表により求め、「基礎控除額」は第2表により求めます。また、
「税率」は第3表の「税額の算式」を意味します。
2 算出したA又はBのそれぞれの税額については円未満の端数を切り捨て、算出した税額
(A−B)に 100 円未満の端数がある場合に、その端数が50 円未満であるときは切り捨て、
50 円以上100 円未満であるときは切り上げます。
3 Aは主たる給与と従たる給与の合計額に対する税額を、Bは主たる給与に対する税額を意
味します。
3 扶養控除等の額の控除
「従たる給与についての扶養控除等申告書」を提出して従たる給与から控除する扶養控除等が
ある場合には、2により求めた税額からその扶養親族等1人につき 1,580 円を控除します。なお、
この場合、税額がマイナスとなったときは、税額0とします。

ということで、コンピューターで計算するには、大変面倒な手順で、税額表どおりの数字を求めることになります。
このページを見てくれている「ららむーむー」さんが、挑戦し、甲欄・乙欄共用の源泉税計算シートを作成してくれました。
指定の手順どおりに計算式を作っています。H列からV列まで、途中経過を追いながら式を作ってあります。

 実際のファイルはここからダウンロード

これをマクロ関数にしてみました。こちらのファイルに、マクロが登録されています。gensenという名前の関数にしてあり、引数は3つあります。社会保険の控除後の給与,扶養家族数,種別(1:甲欄 2:乙欄)の3つを指定すると、源泉税が返されます。式の量が減るので、ファイルサイズはかなり小さくなります。

Function gensen(qyo, fyo, syu)  '最終的に使う関数です。
If syu = 2 Then
gensen = otgen(qyo, fyo)
Else
kqyo = kojo(qyo) - 31667 * (fyo + 1)
gensen = genz(kqyo)
End If
If gensen < 0 Then gensen = 0
End Function


Function kojo(qyo)  '基礎控除後の給与額を計算します
Select Case qyo
Case Is <= 135416: kojo0 = 54167
Case 135417 To 149999: kojo0 = qyo * 0.4
Case 150000 To 299999: kojo0 = qyo * 0.3 + 15000
Case 300000 To 549999: kojo0 = qyo * 0.2 + 45000
Case 550000 To 833333: kojo0 = qyo * 0.1 + 100000
Case Else: kojo0 = qyo * 0.05 + 141667
End Select
kojo = qyo - Application.WorksheetFunction.RoundUp(kojo0, 0)
If kojo < 0 Then kojo = 0
End Function


Function genz(qyo) '控除後の給与額から源泉税額を求めます
Select Case qyo
Case Is <= 162500: gz = qyo * 0.05
Case 162501 To 275000: gz = qyo * 0.1 - 8125
Case 275001 To 579166: gz = qyo * 0.2 - 35625
Case 579167 To 750000: gz = qyo * 0.23 - 53000
Case 750001 To 1500000: gz = qyo * 0.33 - 128000
Case Else: gz = qyo * 0.4 - 233000
End Select
genz = Application.WorksheetFunction.Round(gz, -1)
End Function


Function otgen(qyo, fyo) '乙欄の源泉税額を求めます。fyoは、扶養家族数です。
If qyo < 88000 Then otgen = Application.WorksheetFunction.Round(qyo * 0.03, -1): Exit Function
If qyo > 1010000 Then
otgen = Application.WorksheetFunction.Round((qyo - 1010000) * 0.38 + 367400, -1): Exit Function
End If
Select Case qyo
Case 88000 To 98999: kaisa = 1000: kmin = 88000
Case 99000 To 220999: kaisa = 2000: kmin = 99000
Case 221000 To 1009999: kaisa = 3000: kmin = 221000
End Select
otkjn = kmin + Application.WorksheetFunction.Floor(qyo - kmin, kaisa)
qyoa = otkjn * 2.5: a = kojo(qyoa) - 31667
qyob = otkjn * 1.5: b = kojo(qyob) - 31667
otgen = Application.WorksheetFunction.Round(genz(a) - genz(b) - 1580 * fyo, -2)
If otgen < 0 Then otgen = 0
End Function
 

表紙へ