excel如何创建用户窗体
发布网友
发布时间:2022-04-27 09:35
我来回答
共1个回答
热心网友
时间:2022-05-29 13:02
下面,创建一个简单的用户窗体,用于输入“入职员工信息”数据。
设计用户窗体
下表是个简单的“入职员工信息”数据库,用户窗体用于收集信息并将数据信息保存到该数据库中。
打开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
现在,运行用户窗体来看看效果。