一個同學讓我幫下他的忙,寫一個能生成工資單的Excel宏,從工資明細表中抽取相關數據,生成簡易明了的工資單,嘗試了一下,代碼如下,僅作為記錄:
- Sub 工資條計算()
- 'Sheet名稱
- Dim DataSource As String
- Dim Target As String
- Dim Tpl As String
- Dim TableHeaderPos As Integer
- Dim EmptyCol As Integer
- Dim DataStartRow As Integer
- Dim MaxColCounts As Integer
- DataSource = "匯總明細"
- Target = "宏工資條"
- Tpl = "工資表1"
- TableHeaderPos = 4
- DataStartRow = TableHeaderPos + 1
- MaxColCounts = 32 '數據源中最大的橫向寬度
- MaxColTplCounts = 16 '生成工資表中的最大橫向寬度
- '收集工資單目標表頭
- Dim TargetTableHeader(1 To 100) As String
- Dim Temp As Integer
- Temp = 1
- Do
- If (Worksheets(Tpl).Cells(1, Temp) = "" And Temp = MaxColTplCounts) Then Exit Do
- TargetTableHeader(Temp) = Worksheets(Tpl).Cells(1, Temp)
- Temp = Temp + 1
- Loop
- Temp = 1
- '得到總共的數據條數
- Dim AllDataCounts As Integer
- Do
- If (Worksheets(DataSource).Range("A" & Temp) = "") Then Exit Do
- Temp = Temp + 1
- Loop
- AllDataCounts = Temp - TableHeaderPos - 1
- '得到當前月份,工資單是上一個月
- Dim NowMonth As String
- Dim TableMonth As Integer
- NowMonth = Format(Now, "m")
- TableMonth = CInt(NowMonth) - 1
- '開始填充數據
- '外層循環,行數,Y
- Dim TargetDataStartRow As Integer
- Dim Cookie As Integer
- Cookie = 1
- TargetDataStartRow = 5 '默認從第5行開始
- For Y = TargetDataStartRow To (TargetDataStartRow + AllDataCounts - 1)
- '內層循環,列數,X
- For X = 1 To (MaxColTplCounts - 1)
- '寫入表頭
- Worksheets(Target).Cells(Y + Cookie - 1, X) = TargetTableHeader(X)
- '調整表頭樣式
- Worksheets(Target).Cells(Y + Cookie - 1, X).Select
- Selection.Font.Size = 10
- '寫入數據
- '月份
- If (X = 1) Then Worksheets(Target).Cells(Y + Cookie, X) = TableMonth
- '姓名
- If (X = 2 Or X = 3) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, X)
- '固定工資 9 + 10
- If (X = 4) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 9).Text) + Val(Worksheets(DataSource).Cells(Y, 10).Text)
- '績效薪資標準,三個
- If (X = 5 Or X = 6 Or X = 7) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, X + 6)
- '缺勤扣款
- If (X = 8) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, 15)
- '其他工資 16 + 17
- If (X = 9) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 16).Text) + Val(Worksheets(DataSource).Cells(Y, 17).Text)
- '福利收入 18 -> 22
- If (X = 10) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 18).Text) + Val(Worksheets(DataSource).Cells(Y, 19).Text) + Val(Worksheets(DataSource).Cells(Y, 20).Text) + Val(Worksheets(DataSource).Cells(Y, 21).Text) + Val(Worksheets(DataSource).Cells(Y, 22).Text)
- '其它及獎懲 23 - 24
- If (X = 11) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 23).Text) - Val(Worksheets(DataSource).Cells(Y, 24).Text)
- '應發工資 和 其他扣款
- If (X = 12 Or X = 13) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, X + 13)
- '保險扣款 27 + 28 + 29
- If (X = 14) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 27).Text) + Val(Worksheets(DataSource).Cells(Y, 28).Text) + Val(Worksheets(DataSource).Cells(Y, 29).Text)
- '實發工資
- If (X = 15) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, MaxColCounts - 1)
- '調整樣式
- Worksheets(Target).Cells(Y + Cookie, X).Select
- Selection.Font.Bold = True
- Next
- Cookie = Cookie + 1
- Next
- '數據生成完畢,開始樣式調整
- '總體調整
- Cells.Select
- With Selection
- .HorizontalAlignment = xlCenter
- .VerticalAlignment = xlCenter
- .WrapText = True
- .Orientation = 0
- .AddIndent = False
- .IndentLevel = 0
- .ShrinkToFit = False
- .ReadingOrder = xlContext
- .MergeCells = False
- End With
- Worksheets(Target).Range("A1").Select
- End Sub
今天(2012/07/29)又做了下修改,按照同學的一些改動需求:
- Sub 工資條計算()
- 'Sheet名稱
- Dim DataSource As String
- Dim Target As String
- 'Dim Tpl As String
- Dim TableHeaderPos As Integer
- Dim EmptyCol As Integer
- Dim DataStartRow As Integer
- Dim MaxColCounts As Integer
- DataSource = "匯總明細"
- Target = "宏工資條"
- 'Tpl = "工資表1"
- TableHeaderPos = 4
- DataStartRow = TableHeaderPos + 1
- MaxColCounts = 32 '數據源中最大的橫向寬度
- MaxColTplCounts = 16 '生成工資表中的最大橫向寬度
- '收集工資單目標表頭,寫成死的表頭
- Dim TargetTableHeader(1 To 100) As String
- '以下為注釋
- 'Dim Temp As Integer
- 'Temp = 1
- 'Do
- ' If (Worksheets(Tpl).Cells(1, Temp) = "" And Temp = MaxColTplCounts) Then Exit Do
- ' TargetTableHeader(Temp) = Worksheets(Tpl).Cells(1, Temp)
- ' Temp = Temp + 1
- 'Loop
- TargetTableHeader(1) = "月份"
- TargetTableHeader(2) = "姓名"
- TargetTableHeader(3) = "中心/部門"
- TargetTableHeader(4) = "固定工資"
- TargetTableHeader(5) = "績效薪資標準"
- TargetTableHeader(6) = "本月季績效系數"
- TargetTableHeader(7) = "月季薪制績效工資實發"
- TargetTableHeader(8) = "缺勤扣款"
- TargetTableHeader(9) = "其他工資"
- TargetTableHeader(10) = "福利收入"
- TargetTableHeader(11) = "其他及獎懲"
- TargetTableHeader(12) = "應發工資"
- TargetTableHeader(13) = "其他扣款"
- TargetTableHeader(14) = "保險扣款"
- TargetTableHeader(15) = "實發工資"
- Temp = 1
- '得到總共的數據條數
- Dim AllDataCounts As Integer
- Do
- If (Worksheets(DataSource).Range("A" & Temp) = "") Then Exit Do
- Temp = Temp + 1
- Loop
- AllDataCounts = Temp - TableHeaderPos - 1
- '得到當前月份,工資單是上一個月
- Dim NowMonth As String
- Dim TableMonth As Integer
- NowMonth = Format(Now, "m")
- TableMonth = CInt(NowMonth) - 1
- '開始填充數據
- '外層循環,行數,Y
- Dim TargetDataStartRow As Integer
- Dim Cookie As Integer
- Dim A As String
- Dim B As String
- Cookie = 1
- TargetDataStartRow = 5 '默認從第5行開始
- For Y = TargetDataStartRow To (TargetDataStartRow + AllDataCounts - 1)
- '內層循環,列數,X
- For X = 1 To (MaxColTplCounts - 1)
- '寫入表頭
- Worksheets(Target).Cells(Y + Cookie - 1, X) = TargetTableHeader(X)
- '寫入數據
- '月份
- If (X = 1) Then Worksheets(Target).Cells(Y + Cookie, X) = TableMonth
- '姓名
- If (X = 2 Or X = 3) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, X)
- '固定工資 9 + 10
- If (X = 4) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 9).Text) + Val(Worksheets(DataSource).Cells(Y, 10).Text)
- '績效薪資標準,三個
- If (X = 5 Or X = 6 Or X = 7) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, X + 6)
- '缺勤扣款
- If (X = 8) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, 15)
- '其他工資 16 + 17
- If (X = 9) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 16).Text) + Val(Worksheets(DataSource).Cells(Y, 17).Text)
- '福利收入 18 -> 22
- If (X = 10) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 18).Text) + Val(Worksheets(DataSource).Cells(Y, 19).Text) + Val(Worksheets(DataSource).Cells(Y, 20).Text) + Val(Worksheets(DataSource).Cells(Y, 21).Text) + Val(Worksheets(DataSource).Cells(Y, 22).Text)
- '其它及獎懲 23 - 24
- If (X = 11) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 23).Text) + Val(Worksheets(DataSource).Cells(Y, 24).Text)
- '應發工資 和 其他扣款
- If (X = 12 Or X = 13) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, X + 13)
- '保險扣款 27 + 28 + 29
- If (X = 14) Then Worksheets(Target).Cells(Y + Cookie, X) = Val(Worksheets(DataSource).Cells(Y, 27).Text) + Val(Worksheets(DataSource).Cells(Y, 28).Text) + Val(Worksheets(DataSource).Cells(Y, 29).Text)
- '實發工資
- If (X = 15) Then Worksheets(Target).Cells(Y + Cookie, X) = Worksheets(DataSource).Cells(Y, MaxColCounts - 1)
- Next
- '把調整樣式的代碼放在這里,執行效率比較高
- '表頭,數據
- A = RTrim(LTrim(Str(Y + Cookie - 1)))
- B = RTrim(LTrim(Str(Y + Cookie)))
- '表頭
- Worksheets(Target).Rows(A & ":" & A).Select
- Selection.Font.Size = 10
- Selection.RowHeight = 24
- '數據
- Worksheets(Target).Rows(B & ":" & B).Select
- Selection.Font.Size = 11
- Selection.RowHeight = 24
- Selection.Font.Bold = True
- Cookie = Cookie + 1
- Next
- '數據生成完畢,開始樣式調整
- '總體調整
- Cells.Select
- With Selection
- .HorizontalAlignment = xlCenter
- .VerticalAlignment = xlCenter
- .WrapText = True
- .Orientation = 0
- .AddIndent = False
- .IndentLevel = 0
- .ShrinkToFit = False
- .ReadingOrder = xlContext
- .MergeCells = False
- End With
- Worksheets(Target).Range("A1").Select
- End Sub
新聞熱點
疑難解答