Public dic As Object, dic_工资求和 As Object, dic_已交税额 As Object, dic_项目信息 As Object, dic_受雇日期 As Object
Public ar_res, ar_src
Sub main()
' Application.ScreenUpdating = False
清空
受雇日期装入字典
获取原始数据_身份证号码和姓名
受雇日期和人员状态写入字典
在结果数组填写受雇日期和人员状态
计算合计已申报金额和合计已交税
' 结果输出
计算本月交税合计金额
项目信息写入字典
' 结果输出
输出项目信息
计算分摊税金
'******
结果输出
销毁
' Application.ScreenUpdating = True
MsgBox "OK"
End Sub
Sub 销毁()
Set dic = Nothing
Set dic_工资求和 = Nothing
Set dic_已交税额 = Nothing
Set dic_项目信息 = Nothing
Set dic_受雇日期 = Nothing
End Sub
Sub 受雇日期装入字典()
Set dic_受雇日期 = CreateObject("scripting.dictionary")
With Sheet2
ar = .Range("a1").CurrentRegion
For x = 2 To UBound(ar)
dic_受雇日期(ar(x, 4)) = ar(x, 11)
Next
End With
End Sub
Sub 计算分摊税金()
For x = 1 To UBound(ar_res)
If dic_项目信息.exists(ar_res(x, 1)) Then
项目个数 = dic_项目信息(ar_res(x, 1))(4)
If ar_res(x, 8) > 0 Then
Call 填写分摊个税(项目个数, x)
End If
End If
Next
End Sub
Sub 填写分摊个税(n, row_index)
For x = 1 To n
ar_res(row_index, 12 + k) = Round(ar_res(row_index, 8) / ar_res(row_index, 5) * ar_res(row_index, 11 + k), 2)
k = k + 5
Next
End Sub
Sub 跳步填写银行卡信息(start_row, start_col, ar)
For x = 0 To UBound(ar)
ar_res(start_row, start_col) = ar(x)
start_col = start_col + 5
Next
End Sub
Sub 输出项目信息()
For x = 1 To UBound(ar_res)
If dic_项目信息.exists(ar_res(x, 1)) Then
t = dic_项目信息(ar_res(x, 1))
If InStr(t(0), ",") > 0 Then
tem0 = Split(t(0), ",")
Call 跳步填写银行卡信息(x, 9, tem0)
tem1 = Split(t(1), ",")
Call 跳步填写银行卡信息(x, 10, tem1)
tem2 = Split(t(2), ",")
Call 跳步填写银行卡信息(x, 11, tem2)
tem3 = Split(t(3), ",")
Call 跳步填写银行卡信息(x, 13, tem3)
Else
ar_res(x, 9) = t(0) '卡号
ar_res(x, 10) = t(1) '银行名称
ar_res(x, 11) = t(2) '金额
ar_res(x, 13) = t(3) '项目
End If
End If
Next
End Sub
Sub 项目信息写入字典()
Set dic_项目信息 = CreateObject("scripting.dictionary")
For x = 1 To UBound(ar_src)
If Not dic_项目信息.exists(ar_src(x, 1)) Then
dic_项目信息(ar_src(x, 1)) = Array(ar_src(x, 3), ar_src(x, 4), ar_src(x, 6), ar_src(x, 9), 1)
Else
k = dic_项目信息(ar_src(x, 1))
k(0) = k(0) & "," & ar_src(x, 3)
k(1) = k(1) & "," & ar_src(x, 4)
k(2) = k(2) & "," & ar_src(x, 6)
k(3) = k(3) & "," & ar_src(x, 9)
k(4) = k(4) + 1
dic_项目信息(ar_src(x, 1)) = k
End If
Next
End Sub
Sub 计算本月交税合计金额()
For x = 1 To UBound(ar_res)
受雇年度 = Year(ar_res(x, 3))
受雇月份 = Month(ar_res(x, 3))
当前年度 = Year(Now())
当前月份 = Month(Now())
' 本月工资 = dic_工资求和(ar_res(x, 1))
' 申报工资累计 = ar_res(x, 6)
If 受雇年度 = 当前年度 Then
月份系数 = 当前月份 - 受雇月份 + 1
ElseIf 受雇年度 < 当前年度 Then
月份系数 = 当前月份
End If
If ar_res(x, 5) + ar_res(x, 6) - 5000 * 月份系数 < 0 Then
计税金额 = 0
Else
计税金额 = ar_res(x, 5) + ar_res(x, 6) - 5000 * 月份系数
End If
res_tem = 按阶梯计算个税(计税金额, 月份系数)
If res_tem > 0 Then
ar_res(x, 8) = res_tem - ar_res(x, 7)
Else
ar_res(x, 8) = 0
End If
' ar_res(x, 8) = 按阶梯计算个税(计税金额, 月份系数)
Next
End Sub
Function 按阶梯计算个税(s, 系数)
If s <= 3000 * 系数 Then
按阶梯计算个税 = s * 0.03
ElseIf s <= 12000 * 系数 Then
按阶梯计算个税 = s * 0.1 - 210 * 系数
ElseIf s <= 25000 * 系数 Then
按阶梯计算个税 = s * 0.2 - 1410 * 系数
ElseIf s <= 35000 * 系数 Then
按阶梯计算个税 = s * 0.25 - 2660 * 系数
ElseIf s <= 55000 * 系数 Then
按阶梯计算个税 = s * 0.3 - 4410 * 系数
ElseIf s <= 80000 * 系数 Then
按阶梯计算个税 = s * 0.35 - 7160 * 系数
ElseIf s > 80000 * 系数 Then
按阶梯计算个税 = s * 0.45 - 15160 * 系数
End If
End Function
Function 日期比较器(d1, d2)
d1 = Replace(d1, "-", "/")
d2 = Replace(d2, ".", "/")
日期比较器 = DateDiff("d", d1, d2)
End Function
Sub 计算合计已申报金额和合计已交税()
Set dic_已交税额 = CreateObject("scripting.dictionary")
With Sheet3
arr = .Range("a1").CurrentRegion
For x = 5 To UBound(arr)
受雇日期 = dic_受雇日期(arr(x, 4))
申报日期 = arr(x, 1)
If 日期比较器(受雇日期, 申报日期) >= 0 Then
If Not dic_已交税额.exists(arr(x, 4)) Then
dic_已交税额(arr(x, 4)) = Array(arr(x, 8), arr(x, 40))
Else
k = dic_已交税额(arr(x, 4))
k(0) = k(0) + arr(x, 8)
k(1) = k(1) + arr(x, 40)
dic_已交税额(arr(x, 4)) = k
End If
End If
Next
For x = 1 To UBound(ar_res)
If dic_已交税额.exists(ar_res(x, 1)) Then
t = dic_已交税额(ar_res(x, 1))
ar_res(x, 6) = t(0)
ar_res(x, 7) = t(1)
End If
Next
End With
End Sub
Sub 清空()
With Sheet4
.Range("b3:x65535").ClearContents
End With
End Sub
Sub 在结果数组填写受雇日期和人员状态()
With Sheet4
.Range("b:b").NumberFormatLocal = "@"
.Range("d:d").NumberFormatLocal = "@"
.Range("j:j").NumberFormatLocal = "@"
r = .Cells(.Rows.Count, 1).End(xlUp).Row
ar_res = .Range("b3:az" & r)
For x = 1 To UBound(ar_res)
If dic.exists(ar_res(x, 1)) Then
t = dic(ar_res(x, 1))
ar_res(x, 3) = Format(t(1), "YYYY-MM-dd")
ar_res(x, 4) = t(0)
End If
If dic_工资求和.exists(ar_res(x, 1)) Then
t = dic_工资求和(ar_res(x, 1))
ar_res(x, 5) = t
End If
Next
End With
End Sub
Sub 获取原始数据_身份证号码和姓名()
Set dic_工资求和 = CreateObject("scripting.dictionary")
Set dic_身份证号 = CreateObject("scripting.dictionary")
With Sheet1
r = .Cells(.Rows.Count, 1).End(xlUp).Row
ar_src = .Range("b2:az" & r)
'工资求和
For x = 1 To UBound(ar_src)
dic_工资求和(ar_src(x, 1)) = dic_工资求和(ar_src(x, 1)) + ar_src(x, 6) '工资单上 本月收入
dic_身份证号(ar_src(x, 1)) = ar_src(x, 2)
Next
End With
With Sheet4
.Range("b:b").NumberFormatLocal = "@"
' .Range("b3").Resize(UBound(ar_src), 1) = Application.Index(ar_src, , 1)
' .Range("c3").Resize(UBound(ar_src), 1) = Application.Index(ar_src, , 2)
.Range("b3").Resize(dic_身份证号.Count, 1) = Application.Transpose(dic_身份证号.keys)
.Range("c3").Resize(dic_身份证号.Count, 1) = Application.Transpose(dic_身份证号.items)
End With
End Sub
Sub 结果输出()
With Sheet4
.Range("b3").Resize(UBound(ar_res), UBound(ar_res, 2)) = ar_res
End With
End Sub
Sub 受雇日期和人员状态写入字典()
With Sheet2
Set dic = CreateObject("scripting.dictionary")
ar = .Range("a1").CurrentRegion
For x = 2 To UBound(ar)
s_人员状态 = ar(x, 7)
s_受雇日期 = ar(x, 11)
dic(ar(x, 4)) = Array(s_人员状态, s_受雇日期)
Next
End With
End Sub