返回列表 上一主題 發帖

奬金要如何用vba計算呢

本帖最後由 GBKEE 於 2013-7-21 05:30 編輯

回復 1# sillykin
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim I As Integer
  4.     With Sheets("&&單位成績總表&&").Range("A3")
  5.         Do While .Offset(I) <> ""
  6.             獎金程式 .Offset(I), .Offset(I, 2), .Offset(I, 4)
  7.             I = I + 1
  8.         Loop
  9.     End With
  10. End Sub
  11. Private Sub 獎金程式(單位 As Range, 職稱 As String, 達成額 As Integer)
  12.     Dim Ar(1 To 2), M, 責任額 As Integer, 達成百分比 As Single, 獎金 As Integer, 副總獎金 As Integer
  13.     '  ****(條件工作表中) 沒有的職稱 ->  高級專員, 權理經理  ***
  14.     If 單位 Like "管理*" Then
  15.         '管理單位:  二等襄理, 一等襄理, 副經理,  經理
  16.         '責任額  :     600 ,     700 ,  800  ,   900
  17.         Ar(1) = Array("二等襄理", "一等襄理", "副經理", "經理")    '***管理單位 :沒有的職稱 ,副總經理
  18.         
  19.         Ar(2) = Array(300, 600, 700, 800, 900, 2500)                                '陣列(責任額) :
  20.     Else
  21.         '營業單位:  二等襄理, 一等襄理, 副經理, ( 協理、經理)  副總經理
  22.         '責任額  :     1500 ,     2000,   2200,     (註1)    ,  2,500
  23.         Ar(1) = Array("二等襄理", "一等襄理", "副經理", "協理", "經理", "副總經理")
  24.         Ar(2) = Array(500, 1500, 2000, 2200, "(註1)", "(註1)", 2500)                '陣列(責任額) :
  25.     End If
  26.     M = Application.Match(職稱, Ar(1), 0)                                           'M > 0 為幹部
  27.     副總獎金 = 0
  28.     If IsError(M) Then
  29.         '***** Match不到職稱時, M = 錯誤值 -> 非幹部**********
  30.          責任額 = Ar(2)(0)                                                          '非幹部 責任額: 300 或 500
  31.         If 單位 Like "管理*" Then   '管理單位
  32.             '陣列:管理單位 非幹部 (獎懲獎金 表)
  33.             Ar(2) = Array(0, 0, -10000, -7000, -5000, -4000, -3000, -2000, -1000, -500, 500, 55)
  34.                          ' ,  ,   <3% ,   <4%,   <5%,   <6%,   <7%,   <%8,  <9% , <10%,>=10%,每1%.
  35.         Else  '營業單位
  36.             '陣列:營業單位 非幹部 (獎懲獎金 表)
  37.             Ar(2) = Array(0, 0, -10000, -7000, -5000, -4000, -3000, -2000, -1000, -500, 800, 75)
  38.                          '0, 0,   <3% ,   <4%,   <5%,   <6%,   <7%,   <%8,  <9% , <10%,>=10%,每1%.
  39.         End If
  40.         '***** Match不到職稱時, M = 錯誤值 -> 非幹部 **********
  41.     Else
  42.        '**************幹部 ************************************
  43.         If M = UBound(Ar(1)) + 1 Then 副總獎金 = 2000                               '副總達到獎金會再多2000元
  44.         責任額 = Ar(2)(M)
  45.         If 單位 Like "管理*" Then
  46.             '陣列:管理單位 幹部 (獎懲獎金 表)
  47.             Ar(2) = Array(0, 0, -25000, -20000, -16000, -12000, -8000, -6000, -4000, -2000, 1000, 75)
  48.                          ' ,  ,   <3% ,   <4%,   <5%,   <6%,   <7%,   <%8,  <9% , <10%,>=10%,每1%.
  49.                                                                                    
  50.         Else
  51.             '陣列:營業單位 幹部 (獎懲獎金 表)
  52.             Ar(2) = Array(0, 0, -25000, -20000, -16000, -12000, -8000, -6000, -4000, -2000, 2000, 155)
  53.                          ' ,  ,   <3% ,   <4%,   <5%,   <6%,   <7%,   <%8,  <9% , <10%,>=10%,每1%.
  54.                                                                                    
  55.         End If
  56.         '**************幹部 ************************************
  57.     End If
  58.     單位.Offset(, 3) = 責任額
  59.     達成百分比 = Round(達成額 / 責任額 * 100, 0)
  60.     單位.Offset(, 5) = 達成百分比
  61.     獎金 = 0
  62.     If 達成額 / 責任額 * 10 < 3 Then
  63.         M = 2
  64.     ElseIf 達成額 / 責任額 * 10 > 10 Then
  65.         M = 10
  66.         獎金 = Ar(2)(UBound(Ar(2)))
  67.     Else
  68.         M = Int(達成額 / 責任額 * 10)
  69.     End If
  70.     'Ar(2)(M) = 獎懲的金額
  71.     單位.Offset(, 6) = Ar(2)(M) + ((達成百分比 - 100) * 獎金) + 副總獎金
  72.     '獎金計算公式: 獎懲的金額+  ((達成100%以上-100)* 獎金) + 副總獎金
  73. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 10# sillykin
如圖中: 貼在同一模組裡都可(因條件已寫死)


感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 13# sillykin
請修改如下
  1.   單位.Offset(, 3) = 責任額
  2.     達成百分比 = Round(達成額 / 責任額 * 100, 0)
複製代碼
獎金的計算公式為何???
不是這樣嗎->= 獎懲獎金 +  ((達成率100%以上-100)* 獎金) + 副總獎金   
達成率未達100%以上是沒獎金的(達成率100%以上-100)* 獎金
達成率有達100%,獎懲獎金才會為正值
你的公式 (ROUND(F7-100,0)*155+2000) -> 獎懲獎金(一律都有) +2000
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 16# sillykin
程式已修改請重新下載8# 程式碼
有錯誤請看圖


   
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 21# sillykin
請上傳檔案看看
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 23# sillykin
  1. Option Explicit
  2. Sub Ex()
  3.     Dim I As Integer
  4.     With Sheets("&&單位成績總表&&").Range("A3")
  5.         Do While .Offset(I) <> ""
  6.             獎金程式 .Offset(I), .Offset(I, 2), .Offset(I, 4)
  7.             I = I + 1
  8.         Loop
  9.     End With
  10. End Sub
  11. Private Sub 獎金程式(單位 As Range, 職稱 As String, 達成額 As Integer)
  12.     Dim Ar, 責任額 As Integer, 達成百分比 As Single, 獎金 As Integer, 副總獎金 As Integer
  13.     '  ****(條件工作表中) 沒有的職稱 ->  高級專員, 權理經理  ***
  14.     Dim 部門 As String, 稱呼 As String, M As Integer, A As Integer
  15.     ' *******LTrim、RTrim 與 Trim 函數  傳回一個沒有前頭空白 (LTrim)、後面空白 (RTrim)***************************
  16.                                                        '或前後均無空白的Variant (String),其中所含為給定的字串。*
  17.     稱呼 = Trim(單位.Offset(, 2))                                      '傳回職稱前後均無空白的Variant (String)  *
  18.     '************************************************************************************************************
  19.     單位.Offset(, 7) = Application.Match(稱呼, Array(0, "副總經理", "協理", "高級專員", "經理", _
  20.     "權理經理", "副經理", "副理", "一等襄理", "二等襄理", "業務專員", "辦事員", "助理員", "雇員", "服務生"), 0)
  21.     '************************************************************************************************************
  22.     '************************************************************************************************************
  23.     部門 = Replace(單位, "單位", "")                                    '去掉 "單位" 傳回 數字或文字            *
  24.     If Mid(部門, 1, 1) Like "[0-9]" Then 部門 = "營業部門"              '為數字->營業部門                       *
  25.     責任額 = IIf(部門 = "營業部門", 500, 300)                           '預設為非幹部的責任額                   *
  26.     副總獎金 = 0                                                        '預設為副總獎金為 0                     *
  27.     '************************************************************************************************************
  28.     If 部門 = "營業部門" Then
  29.         Ar = Array(0, 0, -10000, -7000, -5000, -4000, -3000, -2000, -1000, -500, 800, 75)           '非幹部(獎懲獎金)
  30.         If 單位.Offset(, 7) <= 10 Then
  31.             Ar = Array(0, 0, -25000, -20000, -16000, -12000, -8000, -6000, -4000, -2000, 2000, 155) '幹部  (獎懲獎金)
  32.             M = Application.Match(稱呼, Array("高級專員", "二等襄理", "一等襄理", "副經理", "協理", "經理", "副總經理"), 0)
  33.             'M = > Match 的數字
  34.             責任額 = Application.Index(Array(100, 1500, 2000, 2200, "(註1)", "(註1)", 2500), M)  '責任額 陣列(高級專員->100)
  35.             'Index 傳回一個表格或範圍內的某個值或參照位址。
  36.             副總獎金 = IIf(稱呼 = "副總經理", 2000, 0)
  37.         End If
  38.     Else
  39.         部門 = "管理部門"
  40.         Ar = Array(0, 0, -10000, -7000, -5000, -4000, -3000, -2000, -1000, -500, 500, 55)  '非幹部(獎懲獎金)
  41.         If 單位.Offset(, 7) <= 10 Then
  42.             Ar = Array(0, 0, -25000, -20000, -16000, -12000, -8000, -6000, -4000, -2000, 1000, 75)    '幹部  (獎懲獎金)
  43.             M = Application.Match(稱呼, Array("高級專員", "二等襄理", "一等襄理", "副經理", "經理"), 0) '***管理單位 :沒有的職稱 ,副總經理
  44.             責任額 = Application.Index(Array(100, 600, 700, 800, 900, 2500), M)                         '責任額 陣列(高級專員->100)
  45.            '管理部門沒有副總經理 -> ' 副總獎金 = IIf(稱呼 = "副總經理", 2000, 0)
  46.         End If
  47.     End If
  48.     單位.Offset(, 3) = 責任額
  49.     '*************************************** F欄 (達成比率%)用公式有兩式可用*******************************
  50.     單位.Offset(, 5) = "=Round(RC[-1] / RC[-2] * 100, 0)"              'R1C1表示法
  51.    '單位.Offset(, 5) = "=Round(" & 單位.Offset(, 4).Address & " / " & 單位.Offset(, 3).Address & "* 100, 0)"
  52.     '*******************************************************************************************************
  53.     達成百分比 = Round(達成額 / 責任額 * 100, 0)
  54.     '單位.Offset(, 5) = 達成百分比
  55.     獎金 = 0
  56.     If 達成額 / 責任額 * 10 < 3 Then
  57.         M = 2
  58.     ElseIf 達成額 / 責任額 * 10 > 10 Then
  59.         M = 10
  60.         獎金 = Ar(UBound(Ar))
  61.     Else
  62.         M = Int(達成額 / 責任額 * 10)
  63.     End If
  64.     單位.Offset(, 6) = Ar(M) + ((達成百分比 - 100) * 獎金) + 副總獎金   'Ar(M) = 獎懲的金額
  65.     '獎金計算公式: = 獎懲的金額+  ((達成100%以上-100)* 獎金) + 副總獎金
  66. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 24# sillykin
  1. Option Explicit
  2. Const 管理部門 = "審查部、法務部、會計部、總務部、行政部、信用部、企劃部、教育部、人事部"
  3. Const 職務別 = "0,副總經理,協理,高級專員,經理,權理經理,副經理,副理,一等襄理,二等襄理,業務專員,辦事員,助理員,雇員,服務生"
  4. Sub Ex()
  5.     Dim I As Integer
  6.     With Sheets("&&單位成績總表&&").Range("A3")
  7.         Do While .Offset(I) <> ""
  8.             獎金程式 .Offset(I), .Offset(I, 2), .Offset(I, 4)
  9.             I = I + 1
  10.         Loop
  11.     End With
  12. End Sub
  13. Private Sub 獎金程式(單位 As Range, 職稱 As String, 達成額 As Integer)
  14.     '  ****(條件工作表中) 沒有的職稱 ->  高級專員, 權理經理  ***
  15.     Dim Ar, 責任額 As Integer, 達成百分比 As Single, 獎金 As Integer, 副總獎金 As Integer
  16.     Dim 部門 As String, 職稱代號 As String, M As Integer '
  17.     'LTrim、RTrim 與 Trim 函數  傳回一個沒有前頭空白 (LTrim)、後面空白 (RTrim)或前後均無空白的Variant (String),其中所含為給定的字串。*
  18.     職稱代號 = Trim(單位.Offset(, 2))                                                   '傳回職稱代號前後均無空白的Variant (String)
  19.     'Split 函數 傳回一個陳列索引從零開始的一維陣列,它包含指定數目的子字串。
  20.     單位.Offset(, 7) = Application.Match(職稱代號, Split(職務別, ","), 0)               'Match 職稱代號在職務別以Split分割出的陣列中的位置
  21.     'InStr 函數 傳回在某字串中一字串的最先出現位置,此位置為 Variant (Long)。
  22.     部門 = IIf(InStr(管理部門, 單位), "管理部門", "營業部門")               'InStr傳回0->沒找到="營業部門"
  23.     副總獎金 = 0                                                        '預設為副總獎金為 0
  24.     責任額 = IIf(部門 = "管理部門", 300, 500)
  25.     If 部門 = "營業部門" Then
  26.         Ar = Array(0, 0, -10000, -7000, -5000, -4000, -3000, -2000, -1000, -500, 800, 75)           '非幹部(獎懲獎金)
  27.         If 單位.Offset(, 7) <= 10 Then
  28.             Ar = Array(0, 0, -25000, -20000, -16000, -12000, -8000, -6000, -4000, -2000, 2000, 155) '幹部  (獎懲獎金)
  29.             M = Application.Match(職稱代號, Array("高級專員", "二等襄理", "一等襄理", "副經理", "協理", "經理", "副總經理"), 0)
  30.             'M = > Match 的數字
  31.             責任額 = Application.Index(Array(500, 1500, 2000, 2200, "(註1)", "(註1)", 2500), M)  '責任額 陣列(高級專員->100)
  32.             'Index 傳回一個表格或範圍內的某個值或參照位址。
  33.             副總獎金 = IIf(職稱代號 = "副總經理", 2000, 0)
  34.         End If
  35.     Else       ' 部門 => "管理部門"
  36.         Ar = Array(0, 0, -10000, -7000, -5000, -4000, -3000, -2000, -1000, -500, 500, 55)  '非幹部(獎懲獎金)
  37.         If 單位.Offset(, 7) <= 10 Then
  38.             Ar = Array(0, 0, -25000, -20000, -16000, -12000, -8000, -6000, -4000, -2000, 1000, 75)    '幹部  (獎懲獎金)
  39.             M = Application.Match(職稱代號, Array("高級專員", "二等襄理", "一等襄理", "副經理", "經理"), 0)
  40.             '***沒有的職稱,[副總經理],管理單位如有副總經理(程式執行會產生錯誤)*****************************
  41.             責任額 = Application.Index(Array(100, 600, 700, 800, 900, 2500), M)                         '責任額 陣列(高級專員->100)
  42.            '管理部門沒有副總經理 -> ' 副總獎金 = IIf(職稱代號  = "副總經理", 2000, 0)
  43.         End If
  44.     End If
  45.     單位.Offset(, 3) = 責任額
  46.     '*************************************** F欄 (達成比率%)用公式有兩式可用*******************************
  47.     單位.Offset(, 5) = "=Round(RC[-1] / RC[-2] * 100, 0)"              'R1C1表示法
  48.    '單位.Offset(, 5) = "=Round(" & 單位.Offset(, 4).Address & " / " & 單位.Offset(, 3).Address & "* 100, 0)"
  49.     '*******************************************************************************************************
  50.     達成百分比 = Round(達成額 / 責任額 * 100, 0)
  51.     '單位.Offset(, 5) = 達成百分比
  52.     獎金 = 0
  53.     If 達成額 / 責任額 * 10 < 3 Then
  54.         M = 2
  55.     ElseIf 達成額 / 責任額 * 10 > 10 Then
  56.         M = 10
  57.         獎金 = Ar(UBound(Ar))
  58.     Else
  59.         M = Int(達成額 / 責任額 * 10)
  60.     End If
  61.     單位.Offset(, 6) = Ar(M) + ((達成百分比 - 100) * 獎金) + 副總獎金   'Ar(M) = 獎懲的金額
  62.     '獎金計算公式: = 獎懲的金額+  ((達成100%以上-100)* 獎金) + 副總獎金
  63. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 27# sillykin
不在 管理部門的職稱會是在"營業部門"的
   
  1. Const 管理部門 = "審查部、法務部、會計部、總務部、行政部、信用部、企劃部、教育部、人事部"
  2. 部門 = IIf(InStr(管理部門, 單位), "管理部門", "營業部門")               'InStr傳回  0->沒找到="營業部門"
複製代碼

為何會沒有vba會找不到"營業部門"  請上傳檔案 程式碼看看
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 GBKEE 於 2013-7-23 10:53 編輯

回復 31# sillykin
沒有檔案無法偵錯

30# 試試看


Tset.rar (20.03 KB)
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 33# sillykin





   
  1. Option Explicit
  2. Sub Ex()
  3.     Dim I As Integer
  4.     With Sheets("單位成績總表")     '*** 請 修改一下 工作表的名稱  ***
  5.         If Application.CountA(.[A:A]) <> .Cells(.Rows.Count, "A").End(xlUp).Row Then
  6.             MsgBox "單位別欗 資料不全"
  7.             End
  8.         End If
  9.         Do While .Range("A3").Offset(I) <> ""
  10.             獎金程式 .Range("A3").Offset(I)
  11.            I = I + 1
  12.         Loop
  13.     End With
  14. End Sub
  15. Private Sub 獎金程式(單位 As Range)
  16.     Dim 部門 As String, 職稱代號 As Variant, 職稱 As String, 非幹部 As Integer, Col As String, M
  17.     Dim 責任額 As Integer, 達成額 As Long, 獎金 As Integer, 副總獎金 As Integer
  18.    
  19.     With Sheets("條件") '工作表
  20.         部門 = IIf(IsError(Application.Match(單位, .Range("E2", .Range("E2").End(xlDown)), 0)), "營業單位", "管理單位")
  21.         職稱 = 單位.Offset(, 2)
  22.         職稱代號 = Application.Match(職稱, .Range("A:A"), 0)                    '尋找職稱的列位
  23.         If IsError(職稱代號) Then
  24.             MsgBox IIf(職稱 = "", "職稱 沒有輸入!! ", "職稱 : " & 職稱 & " 找不到!!!"), , 部門
  25.             End
  26.         End If
  27.         非幹部 = .Range("B" & Application.Match("非幹部", .Range("C:C"), 0))
  28.         'C欗尋找第1 個"非幹部"的列位 帶入B欄中 得到"非幹部"的代號
  29.         
  30.         'E欄 管理單位範圍裡 尋找部門的列位 : 沒找到為 "營業單位" ,找到為"管理單位"
  31.         If 職稱代號 >= 非幹部 Then
  32.             責任額 = IIf(部門 = "營業單位", .Range("H2"), .Range("J2"))   '可在 H2,J2 修改非幹部的責任額
  33.             Col = IIf(部門 = "營業單位", "Q", "S")                        '非幹部獎懲標準表挌 : 在"Q欗" 或 "S欗"
  34.         Else
  35.            Col = IIf(部門 = "營業單位", "G:G", "I:I")                     '幹部責任額表挌 : 在"G:G欗" 或 "I:I欗"
  36.            M = Application.Match(職稱, .Range(Col), 0)                    '尋找幹部責任額的職稱位置
  37.            If IsError(M) Then
  38.                 MsgBox 部門 & " 中沒有  " & 職稱, , 部門
  39.                 End
  40.             End If
  41.            責任額 = .Range(Col).Cells(M).Offset(, 1)                      '幹部的責任額
  42.            Col = IIf(部門 = "營業單位", "P", "R")                         '非幹部獎懲標準表挌 : 在"P欗" 或 "R欗"
  43.         End If
  44.         單位.Offset(, 3) = 責任額
  45.         達成額 = 單位.Offset(, 4)
  46.         達成百分比 = Round(達成額 / 責任額 * 100, 0)
  47.         單位.Offset(, 5) = 達成百分比
  48.         單位.Offset(, 7) = 職稱代號
  49.         If 達成額 / 責任額 * 10 < 3 Then
  50.             M = 3
  51.         ElseIf 達成額 / 責任額 * 10 > 10 Then
  52.             M = 11
  53.             獎金 = .Range(Col & 12)
  54.             副總獎金 = IIf(職稱 = "副總經理", 2000, 0)                  '副總達到獎金會在多2000元
  55.         Else
  56.             M = Int(達成額 / 責任額 * 10) + 1
  57.         End If
  58.         '獎懲的金額 = .Range(Col & M)
  59.         '獎金計算公式: 獎懲的金額+  ((達成100%以上-100)* 獎金) + 副總獎金
  60.         '下式為在獎金欗上輸入公式
  61.         單位.Offset(, 6) = "=" & .Range(Col & M) & " + ((" & 達成百分比 & " - 100) *" & 獎金 & ") +" & 副總獎金
  62.         '****************************************************************************************
  63.         '單位.Offset(, 6) = .Range(Col & M) + ((達成百分比 - 100) * 獎金) + 副總獎金  '直接給數值
  64.     End With
  65. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 要批評別人時,先想想自己是否完美無缺。
返回列表 上一主題