EXCEL VBA行政与人力资源管理应用案例详解 第4章.pdf
C H A P T E R 基本设置模块的设计 4-1 部门设置子模块设计 4-2 其他基础设置子模块的设计 4-3 其他基础设置子模块应用示例 行政与人力资源管理应用案例详解 基本设置模块包括“部门设置”、“职位设置”、“职务设置”、“职称设置”、“文化程度设置”、“职工类别设置”、“工作地点设置”和“合同类别设置”等基本子模块,分别用于对部门、职位、职务、职称、文化程度、职工类别、工作地点和合同类别等项目进行设置。设立基本设置模块的目的,是为了方便输入数据和查询数据,提高工作效率。4-1 部门设置子模块设计 部门设置子模块的功能,就是以数据库“人事管理.mdb”中的“部门设置”数据表为基础,通过“部门设置管理”窗体及有关控件,从而完成部门及其负责人的添加、修改、删除、保存、查询及显示等基本功能,以及当部门名称改变后对其他所有数据表中的部门名称进行统一修改。本节介绍部门设置子模块的设计方法和步骤。4-1-1 部门设置数据表的设计“部门设置”数据表有 2 个字段:部门名称和部门负责人,它们都是文本型数据,字段大小都是 10 个字符。“部门设置”数据表由系统自动创建,具体的程序代码可参阅第 2章的有关内容。4-1-2 部门设置管理窗体的结构设计“部门设置管理”窗体结构如图 4-1 所示。它是由 1 个用户窗体、4 个框架、1 个列表框、5 个标签、5 个文本框、6 个命令按钮组成。用户窗体及各个控件的功能及属性设置说明如表 4-1 所示。图 4-1 “部门设置管理”窗体结构 表 4-1 用户窗体及各个控件的功能及属性设置说明 控 件 名 称 Caption 属性 功 能 用户窗体 部门设置管理 部门设置管理 框架 Frame1 空值 框架 Frame2 部门名称及负责人列表显示 150 基本设置模块的设计 4 框架 Frame3 部门名称及负责人编辑 框架 Frame4 统一修改所有数据表部门名称 续上表 控 件 名 称 Caption 属性 功 能 列表框 ListBox1 显示或选择部门 标签 Label1 部门总数:对文本框进行说明 标签 Label2 部门名称:对文本框进行说明 标签 Label3 部门负责人:对文本框进行说明 标签 Label4 原名称:对文本框进行说明 标签 Label5 新名称:对文本框进行说明 文本框 部门总数 显示部门总数 文本框 部门_名称 显示或输入部门名称 文本框 部门_负责人 显示或输入部门负责人 文本框 部门_原名称 显示或输入部门原名称 文本框 部门_新名称 显示或输入部门新名称 命令按钮 部门_添加 添加 添加部门 命令按钮 部门_修改 修改 修改部门名称 命令按钮 部门_删除 删除 删除部门 命令按钮 部门_统一修改 统一修改 对所有数据表中的部门名称进行修改 命令按钮 部门_查看数据库 查看数据库 打开人事管理数据库部门设置数据表 命令按钮 部门_退出 退出系统 关闭窗体 4-1-3 程序代码设计 1定义模块级变量 首先定义下面两个模块级变量,它们放在窗体对象程序代码窗口的顶部:Dim cnnBase As ADODB.Connection 定义Connection对象变量 Dim rsDepartment As ADODB.Recordset 定义 Recordset 对象变量 2为“部门设置管理”窗体设计 Initialize 事件程序 为“部门设置管理”窗体设置 Initialize 事件,以便在启动“部门设置管理”窗体时,系统自动建立与“人事管理.mdb”数据库的连接,并对数据表“部门设置”进行查询,将部门信息显示在列表框和文本框中。“部门设置管理”窗体的 Initialize 事件的程序代码如下:Private Sub UserForm_Initialize()建立与人事管理数据库的连接 Set cnnBase=New ADODB.Connection With cnnBase .Provider=microsoft.jet.oledb.4.0 .Open ThisWorkbook.Path&人事管理.mdb End With 151 行政与人力资源管理应用案例详解 Call 显示部门设置数据 查询数据表部门设置,并将查询结果设置为列表框项目 End Sub 3为列表框设计 Change 事件程序 为列表框设计 Change 事件程序的目的,是为了方便用户查看记录。当用户单击列表框中的某个部门时,该部门的名称及负责人名字就自动显示在有关的文本框中。列表框的Change 事件程序代码如下:Private Sub ListBox1_Change()On Error Resume Next 部门_名称.Value=ListBox1.Value 部门_原名称.Value=ListBox1.Value 部门_负责人.Value=ListBox1.List(ListBox1.ListIndex,1)End Sub 4为部门名称、部门负责人和部门新名称 3 个文本框设计 Change 事件程序 由于数据库对部门名称、部门负责人和部门新名称的字段长度限制为 10 个字符,为了防止输入的字符长度超过允许的长度,可以为这 3 个文本框设计 Change 事件程序,以控制用户输入的字符长度。考虑到此人力资源管理系统有很多窗体的文本框都要设置 Change 事件,因此可以把判断控制文本框字符长度的程序代码写成一个子程序。文本框字符判断控制子程序的名为“TextBoxDataLength”,它是一个带参数的子程序,其程序代码如下所示,它保存在一个名为“公共子程序和自定义函数”的标准模块中:Public Sub TextBoxDataLength(myCnn As ADODB.Connection,myTable As String,myFieldName As String,myTextBox As MSForms.TextBox)myCnn 为数据库连接对象变量,myRs 为数据库查询数据集变量 myTable 为查询的数据表,myFieldName 为字段名称,myTextBox 为文本框名称 Dim myDefineSize As Integer,mysql As String Dim myRs As ADODB.Recordset 对数据表 myTable 进行查询,以便获得某字段的长度 mysql=select*from&myTable Set myRs=New ADODB.Recordset myRs.Open mysql,myCnn,adOpenKeyset,adLockOptimistic myDefineSize=myRs.Fields(myFieldName).DefinedSize 获得某字段的长度 If Len(myTextBox.Value)myDefineSize Then MsgBox 字段“&myRs.Fields(myFieldName).Name _&”的长度已经超过了&myDefineSize&个字符!,_ vbCritical+vbOKOnly,警告 myTextBox.Value=Left(myTextBox.Value,myDefineSize)myTextBox.SetFocus End If Set myRs=Nothing End Sub 这样,部门名称、部门负责人和部门新名称这 3 个文本框的 Change 事件程序程序代码分别如下所示:Private Sub 部门_名称_Change()Call TextBoxDataLength(cnnBase,部门设置,部门名称,部门_名称)End Sub Private Sub 部门_负责人_Change()Call TextBoxDataLength(cnnBase,部门设置,部门负责人,部门_负责人)152 基本设置模块的设计 4 End Sub Private Sub 部门_新名称_Change()Call TextBoxDataLength(cnnBase,部门设置,部门名称,部门_新名称)部门_名称.Value=部门_新名称.Value End Sub 5为【添加】按钮设计 Click 事件程序 在文本框中输入部门名称和部门负责人名字后,单击【添加】按钮,就将输入的部门名称和部门负责人名字数据添加到数据表“部门设置”中。【添加】按钮的 Click 事件程序代码如下:Private Sub 部门_添加_Click()On Error GoTo hhh If TextBoxDataIsBlank(部门_名称,部门名称)=True Then Exit Sub If TextBoxDataIsBlank(部门_负责人,部门负责人)=True Then Exit Sub 将当前记录位置移动到记录集中的第一个记录 If rsDepartment.BOF=False Then rsDepartment.MoveFirst 判断记录集中是否已经存在了某个部门 For i=1 To rsDepartment.RecordCount If rsDepartment.Fields(0)=部门_名称.Value Then 弹出信息框,以提醒用户 MsgBox 在数据库中已经存在一个名称为 的部门!&vbCrLf&vbCrLf _&请重新输入部门名称!,vbExclamation,注意 部门_名称.Value=:部门_名称.SetFocus:Exit Sub End If rsDepartment.MoveNext 当前记录位置向前移动一个记录 Next i rsDepartment.AddNew 使用记录集的 AddNew 方法添加记录 rsDepartment.Fields(部门名称)=部门_名称.Value rsDepartment.Fields(部门负责人)=部门_负责人.Value rsDepartment.Update 使用记录集的 Update 方法刷新记录集 rsDepartment.MoveFirst 将当前记录位置移动到记录集中的第一个记录 Call 显示部门设置数据 调用子程序显示部门设置数据,刷新窗口显示 将文本框数据清除,准备添加新的记录 部门_名称.Value=:部门_负责人.Value=:部门_名称.SetFocus:Exit Sub hhh:MsgBox 保存数据出现错误!&vbCrLf&vbCrLf&错误为:&Err.Description End Sub 在 程 序 中,调 用 了 一 个 判 断 文 本 框 是 否 输 入 了 数 据 的 自 定 义 函 数“TextBoxDataIsBlank”,其返回值为 True 或 False,如果文本框中没有输入数据,其返回True,否则返回 False。这个自定义函数保存在一个名为“公共子程序和自定义函数”的标准模块中,其程序代码如下:Public Function TextBoxDataIsBlank(myTextBox As MSForms.TextBox,myText As String)As Boolean TextBoxDataIsBlank=False If myTextBox.Value=Then TextBoxDataIsBlank=True MsgBox myText&不能为空!请输入数据!,vbCritical,警告 myTextBox.SetFocus End If End Function 153 行政与人力资源管理应用案例详解 6为【修改】按钮设计 Click 事件程序 如果输入了错误的部门名称或负责人名字,或者企业的部门名称更改了,或者某个部门的负责人更换了,则可以单击列表框中的某个需要更改部门名称或负责人的项目,然后在部门名称或部门负责人文本框中输入正确的或新的部门名称或负责人,再单击【修改】按钮,对数据库数据进行修改更新。【修改】按钮的 Click 事件程序代码如下:Private Sub 部门_修改_Click()On Error Resume Next 将当前记录位置移动到记录集中的第一个记录 If rsDepartment.BOF=False Then rsDepartment.MoveFirst 判断记录集中是否已经存在了某个部门 For i=1 To rsDepartment.RecordCount If rsDepartment.Fields(部门名称)=部门_名称.Value Then 弹出信息框,以提醒用户 MsgBox 在数据库中已经存在一个名称为 的部门!&vbCrLf&vbCrLf _&只能修改部门负责人!,vbExclamation,注意 若部门名称与原来相同,就仍采用原来的部门名称 部门_名称.Value=rsDepartment.Fields(部门名称)End If rsDepartment.MoveNext 当前记录位置向前移动一个记录 Next i 确定需要修改记录的绝对位置 rsDepartment.AbsolutePosition=ListBox1.ListIndex+1 将新的部门名称和部门负责人保存到数据表中 rsDepartment.Fields(部门名称)=部门_名称.Value rsDepartment.Fields(部门负责人)=部门_负责人.Value rsDepartment.Update 使用记录集的 Update 方法刷新记录集 Call 显示部门设置数据 调用子程序显示部门设置数据,刷新窗口显示 部门_名称.Value=:部门_负责人.Value=:部门_名称.SetFocus:Exit Sub End Sub 7为【删除】按钮设计 Click 事件程序 如果企业撤销了某个部门,就可以在列表框中选择该部门项目,然后单击【删除】按钮,将该部门的数据从数据表中删除。【删除】按钮的 Click 事件程序代码如下:Private Sub 部门_删除_Click()On Error Resume Next If ListBox1.ListIndex=-1 Then 如果没有在列表框中选择项目,就弹出信息框 MsgBox 没有选择要删除的项目!,vbCritical,注意 Exit Sub End If If rsDepartment.BOF=False Then rsDepartment.MoveFirst 将当前记录位置移动到记录集中的第一个记录 rsDepartment.AbsolutePosition=ListBox1.ListIndex+1 确定要删除记录的绝对位置 rsDepartment.Delete 使用记录集的 Delete 方法删除记录 rsDepartment.Update 使用记录集的 Update 方法刷新记录集 End If 将文本框数据清除 部门_名称.Value=:部门_负责人.Value=:部门_原名称.Value=154 基本设置模块的设计 4 Call 显示部门设置数据 调用子程序显示部门设置数据,刷新窗口显示 如果数据表中没有记录,就将光标移到部门名称文本框中 If rsDepartment.RecordCount=0 Then 部门_名称.SetFocus End Sub 8为【查看数据库】按钮设计 Click 事件程序 如果用户想要查看部门设置数据表,并在数据表中直接对记录进行添加、修改和删除等操作,可以单击【查看数据库】按钮。【查看数据库】按钮的 Click 事件程序代码如下:Private Sub 部门_查看数据库_Click()On Error Resume Next Dim mydata As String Dim myaccess As Access.Application 定义Access应用程序对象变量 mydata=ThisWorkbook.Path&人事管理.mdb Set myaccess=GetObject(mydata)使用 DoCmd 对象的 OpenTable 方法打开数据表部门设置 myaccess.DoCmd.OpenTable 部门设置 myaccess.Visible=True 使打开的 Access 数据表窗口可见 myaccess.DoCmd.Maximize 使打开的 Access 数据表窗口最大化 Set myaccess=Nothing 释放变量 myaccess End Sub 9为【退出】按钮设计 Click 事件程序 单击【退出】按钮,将结束操作,关闭部门设置窗口,返回到 Excel 工作表。【退出】按钮的 Click 事件程序代码如下:Private Sub 部门_退出_Click()End End Sub 10为【统一修改】按钮设计 Click 事件程序 如果企业的某个部门名称改变了,则可以单击【统一修改】按钮,一次性地将“人事管理.mdb”数据库中的所有数据表中的部门名称进行修改,这样可以大大提高效率。【统一修改】按钮的 Click 事件程序代码如下:Private Sub 部门_统一修改_Click()On Error GoTo hhh Dim mysql As String Dim rs As ADODB.Recordset If TextBoxDataIsBlank(部门_新名称,部门新名称)=True Then Exit Sub-统一修改“人事管理.mdb”数据库中所有数据表的所有部门名称-修改部门设置数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,部门设置,部门名称)修改招聘申请信息数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,招聘申请信息,申请部门)修改应聘人员初试信息数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,应聘人员初试信息,应聘部门)修改应聘人员面试信息数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,应聘人员面试信息,应聘部门)修改应聘人员基本信息数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,应聘人员基本信息,应聘部门)修改应聘人员教育信息数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,应聘人员教育信息,应聘部门)修改应聘人员工作信息数据表中的部门数据 155 行政与人力资源管理应用案例详解 Call 统一修改部门名称子程序(cnnBase,应聘人员工作信息,应聘部门)修改培训计划信息数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,培训计划信息,申请部门)修改职工培训信息数据表中的部门数据 Call 统一修改部门名称子程序(cnnBase,职工培训信息,所属部门)修改职工基本信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工基本信息,所属部门)修改职工教育信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工教育信息,所属部门)修改职工工作信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工工作信息,所属部门)修改内部调动数据表数据 Set rs=New ADODB.Recordset mysql=update 职工调动信息 set 新部门=&部门_新名称.Value&_&where 新部门=&部门_原名称.Value&rs.Open mysql,cnnBase,adOpenKeyset,adLockOptimistic Set rs=New ADODB.Recordset mysql=update 职工调动信息 set 原部门=&部门_新名称.Value&_&where 原部门=&部门_原名称.Value&rs.Open mysql,cnnBase,adOpenKeyset,adLockOptimistic Set rs=Nothing 修改离退信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工离退信息,原部门)修改职工证照信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工证照信息,所属部门)修改职工技能信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工技能信息,所属部门)修改职工合同信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工合同信息,所属部门)修改职工保险基金信息数据表数据 Call 统一修改部门名称子程序(cnnBase,职工保险基金信息,所属部门)Call 显示部门设置数据 刷新窗口 清除文本框数据 部门_原名称.Value=:部门_新名称.Value=:部门_负责人.Value=MsgBox 所有数据库统一修改完毕!,vbInformation+vbOKOnly,修改完毕 Exit Sub hhh:Call 显示部门设置数据 MsgBox 修改数据出现错误!&vbCrLf&vbCrLf&错误为:&Err.Description End Sub 11子程序“显示部门设置数据”程序代码 在上述的各个控件事件程序中,均调用了一个名为“显示部门设置数据”的子程序,这个子程序的功能是为列表框添加项目,并统计部门总数。其程序代码如下:Public Sub 显示部门设置数据()Dim mysql As String,i As Integer 查询数据表部门设置 Set rsDepartment=New ADODB.Recordset mysql=select*from 部门设置 rsDepartment.Open mysql,cnnBase,adOpenKeyset,adLockOptimistic 部门总数.Value=rsDepartment.RecordCount 156 基本设置模块的设计 4 ListBox1.Clear 清除列表框中旧的项目 ListBox1.ColumnCount=2 将列表框的列数属性(ColumnCount)设置为2列 ListBox1.ColumnWidths=90;60 将列表框的2列列宽分别设置为90和60 If rsDepartment.RecordCount 0 Then 定义数组变量,并将查询的部门名称和部门负责人存放在数组中 ReDim MyArray(rsDepartment.RecordCount-1,1)For i=0 To rsDepartment.RecordCount-1 MyArray(i,0)=rsDepartment.Fields(部门名称)MyArray(i,1)=rsDepartment.Fields(部门负责人)rsDepartment.MoveNext Next i rsDepartment.MoveFirst ListBox1.List()=MyArray 为列表框设置项目 End If End Sub 12子程序“统一修改部门名称子程序”的程序代码 在统一修改部门名称的事件程序中,调用了一个名为“统一修改部门名称子程序”的子程序,其功能是为批量修改某个数据表中满足条件的部门名称。程序代码如下:Public Sub 统 一 修 改 部 门 名 称 子 程 序(myCnn As ADODB.Connection,myTable As String,myDepartment As String)Set rs=New ADODB.Recordset mysql=update&myTable&set _&myDepartment&=&部门_新名称.Value&_&where&myDepartment&=&部门_原名称.Value&rs.Open mysql,myCnn,adOpenKeyset,adLockOptimistic Set rs=Nothing End Sub 4-1-4 为部门设置自定义菜单命令和自定义命令按钮指定宏 为自定义菜单和自定义工具栏中的菜单命令和命令按钮指定一个名为“部门设置”的宏,宏代码如下:Public Sub 部门设置()部门设置管理.Show End Sub 这个宏保存在一个名为“基础设置程序”的标准模块中。4-1-5 部门设置应用示例 运行“部门设置管理”窗体后,如果“部门设置”数据表中还没有数据,则运行后的窗体如图 4-2 所示。在部门名称文本框中输入部门名称,在部门负责人文本框中输入部门负责人名字,如图 4-3 所示。单击【添加】按钮,就将部门名称和部门负责人数据添加到了数据表“部门设置”中,图 4-4 所示,同时列表框中显示出该条记录,第一列为部门名称,第二列为部门负责人。157 行政与人力资源管理应用案例详解 图 4-2 “部门设置管理”窗口 图 4-3 输入部门名称和部门负责人 此时,单击【查看数据库】按钮,打开数据表“部门设置”,可以看到在数据表中已经有了一条记录,如图 4-5 所示。图 4-4 保存部门名称和部门负责人并显示在列表框 图 4-5 数据表中的记录 在列表框中选择某个部门,就在有关的文本框中自动显示该部门名称和负责人名字,如图 4-6 所示。此时,可以对部门名称、负责人名字进行修改,或者对所有的数据表进行统一修改,或者将该条记录删除。如果在输入部门名称或部门负责人时,输入的字符长度超过了系统事先设定的字段长度,系统就会弹出一个【警告】对话框,如图 4-7 所示,告诉用户输入的字符长度超过事先设定的字段长度,单击【确定】按钮,系统自动将超过设定长度的部分截掉。158 基本设置模块的设计 4 图 4-6 在列表框中选择部门,可以进行修改或删除操作 图 4-7 字符长度超过了设置值警告框 4-2 其他基础设置子模块的设计 在基础设置模块中,除了部门设置子模块比较特殊外,其他几个基础设置子模块的窗体结构和程序代码是一样的,因此,可以将这些基础设置项目放置在一个窗体中。这几个基础设置子模块包括:(1)职位类别设置 完成对职位类别的添加、修改、删除、保存、查询等基本功能。(2)职务类别设置 完成对职务类别的添加、修改、删除、保存、查询等基本功能。(3)职称类别设置 完成对职称类别的添加、修改、删除、保存、查询等基本功能。(4)文化程度设置 完成对文化程度的添加、修改、删除、保存、查询等基本功能。文化程度主要分为“博士”、“硕士”、“本科”、“大专”、“中专”、“技校”、“高中”、“职高”、“初中”、“小学”和“文盲”等几大类。(5)职工类别设置 完成对职工类别的添加、修改、删除、保存、查询等基本功能。职工类别主要是将职工分为“正式在职”、“合同在职”、“离退休”、“试用工”、“临时工”5 大类。(6)工作地点设置 完成对工作地点的添加、修改、删除、保存、查询等基本功能。(7)合同类型设置 完成对职工的劳动合同类型的添加、修改、删除、保存、查询等基本功能。设置这些子模块的目的,是为了能够快捷地输入、查询人力资源数据。读者还可以根据企业的具体情况,增加一些其他的基础性项目设置。4-2-1 其他基础设置管理数据表的设计 其他基础设置管理数据表包括以下几个。(1)“职位类别设置”数据表:有 1 个字段,字段名称为“职位”,文本型数据,字段长度为 10 个字符。159 行政与人力资源管理应用案例详解(2)“职务类别设置”数据表:有 1 个字段,字段名称为“职务类别”,文本型数据,字段长度为 10 个字符。(3)“职称类别设置”数据表:有 1 个字段,字段名称为“职称类别”,文本型数据,字段长度为 10 个字符。(4)“文化程度设置”数据表:有 1 个字段,字段名称为“文化程度”,文本型数据,字段长度为 10 个字符。(5)“职工类别设置”数据表:有 1 个字段,字段名称为“职工类别”,文本型数据,字段长度为 10 个字符。(6)“工作地点设置”数据表:有 1 个字段,字段名称为“工作地点”,文本型数据,字段长度为 20 个字符。(7)“合同类型设置”数据表:有 1 个字段,字段名称为“合同类型”,文本型数据,字段长度为 10 个字符。上述 7 个数据表均由系统自动创建,具体的程序代码可参阅第 2 章的有关内容。4-2-2 其他基础设置窗体结构设计 其他基础设置窗体“基础项目设置”的结构如图 4-8 所示,它是由 1 个用户窗体、2个框架、1 个列表框、1 个标签、1 个文本框、6 个命令按钮组成。用户窗体及各个控件的功能及属性设置说明如下。图 4-8 “基础项目设置”窗体结构(1)用户窗体:名称属性设置为“基础项目设置”,Caption 属性设置为“基础项目设置”。(2)2 个框架:它们用于将不同功能的控件组合在一起,其名称属性分别设置为“基础项目列表显示”和“基础项目编辑”,其 Caption 属性分别设置为“基础项目列表显示”和“基础项目编辑”。(2)列表框 ListBox1:用于显示或选择基础项目的具体名称,其有关的属性通过程序来设置。(3)标签:用于对文本框的功能进行说明,其 Caption 属性设置为“基础项目:”。(4)文本框:用于输入和显示基础项目的具体名称,其名称属性设置为“项目名称”。(5)框架 Frame2 内的 3 个命令按钮:分别完成基础项目的具体名称的添加、修改和删除功能,其名称属性分别设置为“添加”、“修改”和“删除”,其 Caption 属性分别设 160 基本设置模块的设计 4 置为“添加”、“修改”和“删除”。(6)用户窗体上的“查看数据库”命令按钮:单击此按钮,可以打开有关的基础设置数据表,以方便用户查看数据表中的记录,或直接在数据表中输入、修改或删除记录。其名称属性设置为“查看数据库”,Caption 属性设置为“查看数据库”。(7)用户窗体上的“退出系统”命令按钮:单击此按钮,退出基础设置窗口,返回到Excel 工作表。其名称属性设置为“退出”,Caption 属性设置为“退出系统”,Cancel 属性设置为 True。4-2-3 程序代码设计 1定义公共变量 由于一些基础设置项目共用一个“基础项目设置”窗体,为了区分不同的基础设置项目,需要设置一个公共变量 myBaseItem,它用 Public 来说明,并保存在一个名为“公共变量”的标准模块中,具体的说明语句如下:Public myBaseItem As String 基础设置的具体项目名称变量 2定义模块级变量 定义下面的模块级变量,它们放在窗体对象程序代码窗口的顶部:Dim cnn As ADODB.Connection Dim rsBase As ADODB.Recordset Dim myTable As String,myFieldName As String 3为“基础项目设置”窗体设计 Initialize 事件程序 为“基础项目设置”窗体设置 Initialize 事件,以便在启动“基础项目设置”窗体时,系统自动建立与数据库“人事管理”的连接,对有关的数据表进行查询,将基础项目信息显示在列表框和文本框中。“基础项目设置”窗体的 Initialize 事件程序代码如下:设计窗体初始化程序 Private Sub UserForm_Initialize()myTable=myBaseItem 设置要查询的数据表名称 基础项目设置.Caption=基础项目设置-&myTable 设置用户窗体的标题 设置文本框的字段名 If myBaseItem=文化程度设置 Then myFieldName=文化程度 ElseIf myBaseItem=职工类别设置 Then myFieldName=职工类别 ElseIf myBaseItem=职称类别设置 Then myFieldName=职称类别 ElseIf myBaseItem=职位类别设置 Then myFieldName=职位 ElseIf myBaseItem=职务类别设置 Then myFieldName=职务类别 ElseIf myBaseItem=工作地点设置 Then myFieldName=工作地点 ElseIf myBaseItem=合同类型设置 Then myFieldName=合同类型 End If 建立与人事管理数据库的连接 Set cnn=New ADODB.Connection 161 行政与人力资源管理应用案例详解 With cnn .Provider=microsoft.jet.oledb.4.0 .Open ThisWorkbook.Path&人事管理.mdb End With 为窗体和有关的框架及标签设置具体标题 基础项目列表显示.Caption=Left(myBaseItem,Len(myBaseItem)-2)&列表显示 基础项目编辑.Caption=Left(myBaseItem,Len(myBaseItem)-2)&项目编辑 基础项目.Caption=Left(myBaseItem,Len(myBaseItem)-2)&项目 Call 显示项目设置数据 调用子程序显示项目设置数据,刷新窗口显示 End Sub 4为列表框设计 Change 事件程序 为列表框设计 Change 事件程序的目的,是为了方便用户查看记录。当用户单击列表框中的某个项目时,该项目的名称就自动显示在文本框中。列表框的 Change 事件程序代码如下:Private Sub ListBox1_Change()项目名称.Value=ListBox1.Value End Sub 5为文本框设计 Change 事件程序 由于数据库对基础项目名称的字段长度有限制,为了防止输入的字符长度超过允许的长度,可以为文本框设计 Change 事件程序,以控制用户输入的字符长度。程序代码如下:Private Sub 项目名称_Change()Call TextBoxDataLength(cnn,rsBase,myTable,myFieldName,项目名称)End Sub 6为【添加】按钮设计 Click 事件程序 当在文本框中输入项目名称后,单击【添加】按钮,将输入的项目名称数据添加到有关的数据表中。【添加】按钮的 Click 事件程序代码如下:Private Sub 添加_Click()On Error Resume Next Dim i As Integer If TextBoxDataIsBlank(项目名称,rsBase.Fields(0).Name)=True Then Exit Sub rsBase.MoveFirst 将当前记录位置移动到记录集中的第一个记录 For i=1 To rsBase.RecordCount 判断记录集中是否已经存在了某个项目名称 If rsBase.Fields(0)=项目名称.Value Then MsgBox 在数据库中已经存在一个项目名称为 的项目!&vbCrLf&vbCrLf _&请重新输入项目名称!,vbExclamation,注意 项目名称.Value=项目名称.SetFocus Exit Sub End If rsBase.MoveNext 当前记录位置向前移动一个记录 Next i rsBase.AddNew 使用记录集的 AddNew 方法添加记录 rsBase.Fields(0)=项目名称.Value rsBase.Update 使用记录集的 Update 方法刷新记录集 rsBase.MoveFirst 将当前记录位置移动到记录集中的第一个记录 Call 显示项目设置数据 调用子程序显示项目设置数据,刷新窗口显示 162 基本设置模块的设计 4 将文本框数据清除,准备添加新的记录 项目名称.Value=:项目名称.SetFocus End Sub 7为【修改】按钮设计 Click 事件程序 如果输入了错误的基础项目名称,则可以单击列表框中的某个需要更改的项目名称,然后在职项目称文本框中输入正确的项目名称,再单击【修改】按钮,对数据库数据进行修改更新。【修改】按钮的 Click 事件程序代码如下:Private Sub 修改_Click()On Error Resume Next Dim i As Integer rsPos