Excel创建简单的数据输入窗体

来源:百度文库 编辑:神马文学网 时间:2024/04/19 20:31:20

下面,创建一个简单的用户窗体,用于输入“入职员工信息”数据。
设计用户窗体
下表是个简单的“入职员工信息”数据库,用户窗体用于收集信息并将数据信息保存到该数据库中。

打开VBE,插入用户窗体,默认名为UserForm1。按下表在用户窗体中添加控件并设置属性。

完成的用户窗体如下图所示。

编写代码
1 编写找到数据库工作表中下一个空白行的代码
在VBE中,插入一个类模块,并命名为cExcelUtils,输入下列代码:

Function FindEmptyRow(ws As Worksheet) As LongDim lngReturn As LonglngReturn = ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).RowFindEmptyRow = lngReturnEnd Function

2 编写代码以包含每个员工信息的值,以及存储数据库工作表的位置,将数据保存到数据库
插入一个类模块,并命名为cEmployeeInfo,添加下面的代码在模块的声明部分:

Private m_lngID      As LongPrivate m_strName    As StringPrivate m_strSchool  As StringPrivate m_blnAbility As BooleanPrivate m_blnObey    As BooleanPrivate m_xlWksht    As WorksheetPrivate m_oXL        As cExcelUtils

前5个变量是我们在用户窗体中要输入的数据,以及从数据库工作表中产生的ID字段。变量m_xlWksht包含数据库工作表的位置。变量m_oXL决定在哪里放置新数据。
首先,添加数据属性。

Property Get ID() As LongID = m_lngIDEnd Property Property Get Name() As StringName = m_strNameEnd Property Property Let Name(newName As String)m_strName = newNameEnd Property Property Get School() As StringSchool = m_strSchoolEnd Property Property Let School(newSchool As String)m_strSchool = newSchoolEnd Property Property Get Ability() As BooleanAbility = m_blnAbilityEnd Property Property Let Ability(newAbility As Boolean)m_blnAbility = newAbilityEnd Property Property Get Obey() As BooleanObey = m_blnObeyEnd Property Property Let Obey(newObey As Boolean)m_blnObey = newObeyEnd Property Property Get DBWorkSheet() As WorksheetSet DBWorkSheet = m_xlWkshtEnd Property Property Set DBWorkSheet(newSheet As Worksheet)Set m_xlWksht = newSheetEnd Property

注意,ID属性没有Property Let方法,因此该属性是只读的。
下面,添加GetNextID方法找到最后一行,从第一列中获取值,然后增加1,以此来设置ID属性的值。

Public Function GetNextID() As LongDim lngReturn As LonglngReturn = m_xlWksht.Cells(Rows.Count, 1).End(xlUp).Value + 1m_lngID = lngReturn '设置ID属性    GetNextID = lngReturnEnd Function

接下来,添加初始化和清除代码:

Private Sub Class_Initialize()Set m_oXL = New cExcelUtilsEnd Sub Private Sub Class_Terminate()Set m_oXL = NothingEnd Sub

再继续完善该类的功能。先添加一些验证代码。如果Name属性和School属性没有数据的话,则不会保存记录。

Public Function ValidateData() As BooleanDim blnReturn As BooleanIf (Len(Me.Name & "") * Len(Me.School & "")) = 0 ThenblnReturn = FalseElseblnReturn = TrueEnd IfValidateData = blnReturnEnd Function

通过文本值的长度相乘,能够决定是否填充数据。
接下来,编写保存功能的代码。需要知道下一个可用行的行号为数据输入,需要知道该行所在的工作表,并且如果没有错误,返回True。

Public Function Save() As BooleanDim lngNewRowNum As LongDim blnReturn As Boolean If m_xlWksht Is Nothing ThenblnReturn = FalseGoTo Exit_FunctionEnd If lngNewRowNum = m_oXL.FindEmptyRow(m_xlWksht) With m_xlWksht.Cells(lngNewRowNum, 1).Value = Me.ID.Cells(lngNewRowNum, 2).Value = Me.Name.Cells(lngNewRowNum, 3).Value = Me.School.Cells(lngNewRowNum, 4).Value = Me.Ability.Cells(lngNewRowNum, 5).Value = Me.ObeyEnd With If Err.Number = 0 ThenblnReturn = TrueEnd If Exit_Function:Save = blnReturnExit FunctionEnd Function

代码首先检查以确保工作表对象存在,如果不存在则返回False并退出函数。接下来,从cExcelUtils对象中获取空行位置。然后,使用代表数据库工作表的m_xlWksht变量,使用从类属性中的数据填充每列。最后,检查没有发生错误,设置返回值为True,然后退出函数。
这就是cEmployeeInfo类,包含从用户窗体中的输入值,为任何新记录找到下一个ID值,保存数据到工作表中下一个空行。
编写用户窗体代码
在用户窗体代码模块中添加下列模块级变量:

Private m_oEmployeeInfo As cEmployeeInfoPrivate m_blnSaved As Boolean

变量m_blnSaved存储从m_oEmployeeInfo对象的Save方法中返回的值。下面,编写用户窗体初始化和中止事件代码:

Private Sub UserForm_Initialize()Set m_oEmployeeInfo = New cEmployeeInfoSet m_oEmployeeInfo.DBWorkSheet = Sheets("入职员工信息")m_oEmployeeInfo.GetNextIDlblID.Caption = m_oEmployeeInfo.IDm_blnSaved = FalseClearFormEnd Sub Private Sub UserForm_Terminate()Set m_oEmployeeInfo = NothingEnd Sub

在用户窗体初始化时,实例化oEmployeeInfo对象,然后设置DBWorksheet属性。然后,获取下一个可用的ID号并将其放置到标签中。也清除了窗体中的控件值。

Private Sub ClearForm()Me.txtName.Value = ""Me.txtSchool.Value = ""Me.chkAbility.Value = FalseMe.chkObey.Value = FalseEnd Sub

用户窗体中有三个命令按钮:一个用于保存输入的数据,一个用于清除用户窗体数据并添加新记录,一个用于取消数据输入操作并且不保存数据而关闭用户窗体。
“保存”按钮应该执行下列功能:

  • 发送数据到cEmployeeInfo类
  • 验收数据,如果数据无效则返回一条消息
  • 如果数据有效则保存数据,并且如果保存成功则返回一条消息
  • 保存后清除用户窗体数据,并重设保存标志

代码如下:

Private Sub cmdSave_Click()With m_oEmployeeInfo.Name = txtName.Text.School = txtSchool.Text.Ability = chkAbility.Value.Obey = chkObey.ValueEnd WithIf Not m_oEmployeeInfo.ValidateData ThenMsgBox "姓名和毕业院校必填", vbOKOnly, "不能保存"Exit SubElsem_blnSaved = m_oEmployeeInfo.SaveEnd IfDoAfterSave m_blnSavedEnd Sub

过程DoAfterSave用于执行清理。

Private Sub DoAfterSave(success As Boolean)If success ThenClearFormlblID.Caption = m_oEmployeeInfo.GetNextIDMsgBox "记录已保存"ElseMsgBox "没有保存记录"End Ifm_blnSaved = False '重设标志End Sub

“新建”按钮的代码如下,在新建之前,检查文本字段看用户窗体中是否有任何数据:

Private Sub cmdNew_Click()'为新记录设置窗体    Dim iAnswer As Integer'检查当前记录是否被保存    If Not m_blnSaved Then '是否有输入的文本没有被保存        If (Len(Me.txtName.Value & "") + Len(Me.txtSchool.Value & "")) <> 0 TheniAnswer = MsgBox("有没有保存的数据,想继续吗?", vbYesNo, "没有保存数据")If iAnswer = vbYes ThenClearFormEnd IfElseClearFormEnd IfEnd IfEnd Sub

“取消”按钮用来清除用户窗体并关闭该用户窗体:

Private Sub cmdCancel_Click()ClearFormUnload UserForm1End Sub

现在,运行用户窗体来看看效果。

如上图所示,当“入职员工信息”用户窗体显示后,ID显示为102,而表中最后一行的ID值为101,第3行为可用的数据输入行。
现在,可以测试代码,在“姓名”文本框中输入信息,而让“毕业院校”留空,单击“保存”按钮,此时会弹出消息提示框,如下图所示。

输入“毕业院校”信息,选择必要的复选框,单击“保存”。此时,显示保存成功的消息框,第3行已经包含了刚才在用户窗体中输入的数据。注意到,用户窗体中的ID号现在已更新,以便输入下一条记录。

再测试“新建”按钮。单击“新建”按钮,用户窗体中除ID号外都为空,什么也没有发生。然而,如果你选择了复选框,再单击该按钮,会清除复选框的选择。如果输入了姓名,而单击“新建”按钮,将会收到一条警告数据没有保存的消息,如下图所示。

如果单击“否”,将返回到用户窗体而不会有任何变化;如果单击“是”,将清除用户窗体中的数据,以便输入新数据。
至此,一个简单的数据输入窗体已经完成。这里使用了类模块技术。