|
楼主 |
发表于 2009-7-1 11:11
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
步骤5,为了在输入人员姓名后在Sheet1工作表的C列中写入相应的日工资标准,在Sheet1工作表的写入下面的代码。- #001 Private Sub Worksheet_Change(ByVal Target As Range)
- #002 Dim rng As Range
- #003 Dim r As Integer
- #004 On Error Resume Next
- #005 With Target
- #006 If .Row > 4 And .Count = 1 Then
- #007 If .Column = 1 Then
- #008 r = Sheet2.Range("A63556").End(xlUp).Row
- #009 For Each rng In Sheet2.Range("A3:A" & r)
- #010 If rng.Text Like .Text Then
- #011 .Offset(, 2).Value = rng.Offset(, 4).Value
- #012 End If
- #013 Next
- #014 End If
- #015 If .Column = 2 Then
- #016 If .Text = "" Then
- #017 Application.EnableEvents = False
- #018 Sheet1.Unprotect
- #019 Rows(.Row).Delete
- #020 Sheet1.Protect
- #021 Application.EnableEvents = True
- #022 End If
- #023 End If
- #024
- #025 End If
- #026 End With
- #027 End Sub
复制代码 代码解析:
Sheet1工作表的Change事件,当输入人员编号和人员姓名后,将对应的日工资标准写入到Sheet1工作表的C列中。
第6行代码设置事件的触发条件。
第7行到第14行代码,删除B列单元格中的人员姓名则同时删除对应的人员编号和日工资标准。
第18行到第29行代码,检查输入的人员姓名是否重复。因为单位中可能有重复的人员姓名,但是人员编号是唯一的,所以根据人员编号检查输入的人员姓名是否重复。
第30行到第34行代码,使用Like方法在根据人员编号在Sheet2表的A列中查找相对应的人员编号,找到后将日工资标准写入到Sheet1工作表的C列中。
在Sheet1工作表的B列中输入人员姓名后效果如图所示。
步骤6,在某些情况下,可能需要输入全部人员的姓名,比如在笔者单位每年的7、8月份要发放高温加班工资,这时可以从Sheet2表中将所有人员的姓名和编号导入到Sheet1表中,需要在模块中写入下面的代码。- #001 Sub ImportName()
- #002 Dim r1 As Integer
- #003 Dim r2 As Integer
- #004 Dim i As Long
- #005 r1 = Sheet1.Range("B63556").End(xlUp).Row
- #006 r2 = Sheet2.Range("B63556").End(xlUp).Row
- #007 If MsgBox("确定要导入所有人员姓名吗", 32 + vbYesNo, "系统提示") = vbNo Then Exit Sub
- #008 Application.ScreenUpdating = False
- #009 With Sheet1
- #010 .Select
- #011 .Unprotect
- #012 If r1 <= r2 + 3 Then .Rows(r1).Resize(r2 - r1 + 4).Insert
- #013 For i = 5 To Sheet1.Range("B63556").End(xlUp).Row - 2
- #014 .Cells(i, 1) = Sheet2.Cells(i - 2, 1)
- #015 .Cells(i, 2) = Sheet2.Cells(i - 2, 2)
- #016 Next
- #017 .Protect
- #018 End With
- #019 Application.ScreenUpdating = True
- #020 End Sub
复制代码 代码解析:
ImportName过程将Sheet2工作表的人员姓名导入到Sheet1工作表的B列单元格中。
第5、6行代码,取得两个工作表中现有数据的行号。
第12行代码,根据两个工作表中现有数据的行号决定在到Sheet1工作表需要插入的行数。
第13行第16行代码,将Sheet2工作表的人员编号和人员姓名导入到Sheet1工作表的B列单元格中,因为在写入的过程中同时会触发工作表的Change事件,所以日工资标准无需导入。
如果有少量不需要计算的人员姓名可以在导入后删除。
步骤7,如果在输入时Sheet1工作表中已有数据,可以先进行清除,在模块中写入下面的代码。- #001 Sub DataClear()
- #002 Dim r As Integer
- #003 With Sheet1
- #004 .Select
- #005 If MsgBox("是否清除加班费数据?", 32 + vbYesNo, "系统提示") = vbNo Then Exit Sub
- #006 .Unprotect
- #007 r = .Range("B63556").End(xlUp).Row
- #008 If r >= 6 Then
- #009 .Rows("5:" & r - 2).Delete
- #010 End If
- #011 r = .Range("B63556").End(xlUp).Row
- #012 Union(.Cells(2, 12), .Range(.Cells(r, 5), .Cells(r, 12))).ClearContents
- #013 .Protect
- #014 Application.GoTo Reference:=.Cells(5, 4), Scroll:=True
- #015 End With
- #016 End Sub
复制代码 代码解析:
DataClear过程清除计算表中已有的数据。
步骤8,在VBE中插入一个窗体,用于计算加班费时选择计算的月份并对Sheet2表的D、F、H和J列中输入的加班班数计算应发的加班费合计,如图所示。
双击窗体写入下面的代码。- #001 Private Sub UserForm_Initialize()
- #002 SpinButton1.Value = Year(Date)
- #003 SpinButton2.Value = Month(Date)
- #004 TextBox1.Text = Year(Date) & "年"
- #005 TextBox2.Text = Month(Date) & "月份"
- #006 End Sub
复制代码 代码解析:
窗体的Initialize事件,在窗体初始化时文本框中显示当前的年月。
双击窗体中的SpinButton控件,写入下面的代码。- #001 Private Sub SpinButton1_Change()
- #002 TextBox1.Text = SpinButton1.Value & "年"
- #003 End Sub
- #004 Private Sub SpinButton2_Change()
- #005 With SpinButton2
- #006 Select Case .Value
- #007 Case 1 To 12
- #008 TextBox2.Text = .Value & "月份"
- #009 Case Is > 12
- #010 TextBox1.Text = Left(TextBox1.Text, 4) + 1 & "年"
- #011 .Value = 1
- #012 Case Is < 1
- #013 TextBox1.Text = Left(TextBox1.Text, 4) - 1 & "年"
- #014 .Value = 12
- #015 End Select
- #016 End With
- #017 End Sub
复制代码 代码解析:
使用SpinButton控件调节窗体中显示的年月,请参阅技巧140 。
双击窗体中的“确定”按钮,写入下面的代码。- #001 Private Sub CommandButton1_Click()
- #002 Dim i As Integer
- #003 Dim r As Integer
- #004 With Sheet1
- #005 .Select
- #006 r = .Range("B63556").End(xlUp).Row
- #007 If .Cells(5, 2) = "" Then
- #008 MsgBox "请把数据填写完整后再计算!", 64, "系统提示"
- #009 Unload Me
- #010 Exit Sub
- #011 End If
- #012 For i = 5 To r - 2
- #013 If WorksheetFunction.CountIf(.Range("B5:B" & i), .Cells(i, 2)) > 1 Then
- #014 If MsgBox(.Cells(i, 2) & "输入重复,是否继续?", 36, "系统提示") = 7 Then
- #015 Unload Me
- #016 Exit Sub
- #017 End If
- #018 End If
- #019 Next
- #020 .Unprotect
- #021 .Cells(2, 12) = TextBox2.Text
- #022 For i = 5 To r - 1
- #023 .Cells(i, 5) = Round(100 * .Cells(i, 4), 2)
- #024 .Cells(i, 7) = Round(.Cells(i, 3) * 1.5 * .Cells(i, 6), 2)
- #025 .Cells(i, 9) = Round(.Cells(i, 3) * 2 * .Cells(i, 8), 2)
- #026 .Cells(i, 11) = Round(.Cells(i, 3) * 3 * .Cells(i, 10), 2)
- #027 .Cells(i, 12) = .Cells(i, 5) + .Cells(i, 7) + .Cells(i, 9) + .Cells(i, 11)
- #028 Next
- #029 .Cells(r, 5) = WorksheetFunction.Sum(.Range("E5:E" & r - 1))
- #030 .Cells(r, 7) = WorksheetFunction.Sum(.Range("G5:G" & r - 1))
- #031 .Cells(r, 9) = WorksheetFunction.Sum(.Range("I5:I" & r - 1))
- #032 .Cells(r, 11) = WorksheetFunction.Sum(.Range("K5:K" & r - 1))
- #033 .Cells(r, 12) = WorksheetFunction.Sum(.Range("L5:L" & r - 1))
- #034 .Protect
- #035 End With
- #036 Unload Me
- #037 MsgBox TextBox1.Text & TextBox2.Text & "的加班费已计算完毕!", 64, "系统提示"
- #038 End Sub
复制代码 代码解析:
窗体中的“确定”按钮的Click事件过程,计算Sheet1表中的加班费合计。
第7行到第11行代码,检查Sheet1表中是否已输入人员姓名及加班班数。
第12行到第19行代码,检查Sheet1表中的人员编号是否重复。
第21行代码,在Sheet1表中写入所计算的月份。
第22行到第28行代码,根据加班班数和相应的系数计算加班费金额。
第29行到第33行代码,计算合计栏的金额。
在Sheet1表中输入人员姓名和加班天数后按窗体的“确定”按钮后效果如图所示。
为了计算高温加班工资,VBE中插入一个和计算加班费类似的窗体,双击窗体中的“确定”按钮,写入下面的代码。- #001 Private Sub CommandButton1_Click()
- #002 Dim rng As Range
- #003 Dim i As Integer
- #004 Dim r As Integer
- #005 With Sheet1
- #006 r = .Range("B63556").End(xlUp).Row
- #007 .Select
- #008 If .Cells(5, 2) = "" Then
- #009 MsgBox "请把数据填写完整后再计算!", 64, "系统提示"
- #010 Unload Me
- #011 Exit Sub
- #012 End If
- #013 For i = 5 To r - 2
- #014 If WorksheetFunction.CountIf(.Range("B5:B" & i), .Cells(i, 2)) > 1 Then
- #015 If MsgBox(.Cells(i, 2) & "输入重复,是否继续?", 36, "系统提示") = 7 Then
- #016 Unload Me
- #017 Exit Sub
- #018 End If
- #019 End If
- #020 Next
- #021 Application.ScreenUpdating = False
- #022 .Unprotect
- #023 .Cells(2, 12) = TextBox2.Text
- #024 With Sheet2.Range("A:A")
- #025 For i = 5 To r - 1
- #026 Set rng = .Find(What:=Cells(i, 1).Value, _
- #027 After:=.Cells(.Cells.Count), _
- #028 LookIn:=xlFormulas, _
- #029 LookAt:=xlWhole, _
- #030 SearchOrder:=xlByRows, _
- #031 SearchDirection:=xlNext, _
- #032 MatchCase:=False)
- #033 If Not rng Is Nothing Then
- #034 Sheet1.Cells(i, 12) = Round(((Val(rng.Offset(0, 2)) + Val(rng.Offset(0, 3))) / 2), 2)
- #035 End If
- #036 Next
- #037 End With
- #038 .Cells(r, 12) = WorksheetFunction.Sum(.Range("L5:L" & r - 1))
- #039 .Protect
- #040 End With
- #041 Application.ScreenUpdating = True
- #042 Unload Me
- #043 MsgBox TextBox1.Text & TextBox2.Text & "的高温工资计算完毕!", 64, "系统提示"
- #044 End Sub
复制代码 代码解析:
窗体中的“确定”按钮的Click事件过程,计算Sheet1表中的高温工资。
第8行到第12行代码,检查Sheet1表中是否已输入人员姓名。
第13行到第20行代码,检查Sheet1表中的人员编号是否重复。
第23行代码,在Sheet1表中写入所计算的月份。
第24行到第37行代码,根据Sheet1表中的人员编号在Sheet2表中查找对应的“技能工资”和“岗位工资”并将其合计数的二分之一写入到Sheet1表中。(笔者所在单位每年发一次高温加班工资,为职工“技能工资”和“岗位工资”之和,分两个月发放)
第38行代码,计算合计栏的金额。
在Sheet1表中输入人员姓名和加班天数后按窗体的“确定”按钮后效果如图所示。
|
|