如何在Excel中创建一个表单
“课程预订表”是一个简单的表单,说明了用户表单设计的原理以及相关的VBA编码。
它使用控件的选择,包括文本框,组合框,组合在框架中的选项按钮,复选框和命令按钮。
当用户单击“确定”按钮时,其输入将输入到工作表上的下一个可用行。
Excel格式的描述:
有两个简单的文本框(Name:_和_Phone:),用户可以在其中输入自由文本,还有两个组合框(Department_和_Course)
让用户从列表中选择一个项目。
框架(Level)中分为三个选项按钮(Introduction _, Intermediate_和_Advanced_),因此用户只能选择其中一个选项。
有两个复选框(“ Lunch Required”和“ Vegetarian”),因为它们未分组在一个框架中,因此如果需要,可以同时选中它们。
但是,如果预订人员不想吃午餐,我们就不需要知道他们是否素食。因此,_Vegetarian_复选框为灰色,直到需要为止。
一共有三个命令按钮(OK _, Cancel_和_Clear Form_),每个按钮在单击时都会执行预定义的功能。
控件属性设置:
Control |
Type |
Property |
Setting |
UserForm |
UserForm |
Name |
frmCourseBooking |
Caption |
Course Booking Form |
||
Name |
Text Box |
Name |
txtName |
Phone |
Text Box |
Name |
txtPhone |
Department |
Combo Box |
Name |
cboDepartment |
Course |
Combo Box |
Name |
cboCourse |
Level |
Frame |
Name |
fraLevel |
Caption |
Level |
||
Introduction |
Option Button |
Name |
optIntroduction |
Intermediate |
Option Button |
Name |
optIntermediate |
Advanced |
Option Button |
Name |
optAdvanced |
Lunch Required |
Check Box |
Name |
chkLunch |
Vegetarian |
Check Box |
Name |
chkVegetarian |
Enabled |
False |
||
OK |
Command Button |
Name |
cmdOk |
Caption |
OK |
||
Default |
True |
||
Cancel |
Command Button |
Name |
cmdCancel |
Caption |
Cancel |
||
Cancel |
True |
||
Clear Form |
Command Button |
Name |
cmdClearForm |
=== 在Excel中创建表单如果要自己构建表单,只需复制上图所示的布局即可。请按照以下步骤操作:
1.打开您想要表单所属的工作簿(必须将UserForms(如宏)附加到工作簿),然后切换到Visual Basic编辑器。
2.在Visual Basic编辑器中,单击“插入用户窗体”按钮(或转到“插入”>“用户窗体”)。
3.如果工具箱没有单独显示(首先单击表单以确保它没有隐藏),请单击“工具箱”按钮(或转到“视图”>“工具箱”)。
4.要将控件放置在表单上,请单击工具箱上的相应按钮,然后单击表单。可以通过拖动控件的边缘来移动控件,也可以通过拖动控件周围的按钮来调整控件的大小。
5.要编辑控件的属性,请确保已选择所选控件,然后在“属性”窗口中进行适当的更改。如果看不到属性窗口,请转到视图>属性窗口。
6.要从表单中删除控件,请选择它,然后单击键盘上的Delete键。
在创建驱动表单及其各种控件的代码之前,UserForm实际上不会做任何事情。下一步是编写驱动表单本身的代码。
添加代码:1初始化表格=====初始化表格:
大多数表单在打开时都需要进行某种设置。这可能是设置默认值,确保字段为空或构建组合框列表。这个过程称为_Initialising Form_,它由一个名为UserForm_Initialize的宏来处理(以防万一,因为我对“ initialis(z)e”一词的不同拼写感到困惑,这是因为我说英语,而VBA却说美国话-但是不用担心,VBA会为您拼写!)。以下是构建代码以初始化课程预订表的方法:
1.要查看表单的代码窗口,请转到查看>代码或单击F7。
2.首次打开代码窗口时,它包含一个空的UserForm_Click()过程。使用代码窗口顶部的下拉列表选择UserForm和Initialize。这将创建您需要的过程。现在,您可以删除UserForm_Click()过程。
3.在过程中输入以下代码:
Private Sub UserForm_Initialize() txtName.Value = "" txtPhone.Value = "" With cboDepartment .AddItem "Sales" .AddItem "Marketing" .AddItem "Administration" .AddItem "Design" .AddItem "Advertising" .AddItem "Dispatch" .AddItem "Transportation" End With cboDepartment.Value = "" With cboCourse .AddItem "Access" .AddItem "Excel" .AddItem "PowerPoint" .AddItem "Word" .AddItem "FrontPage" End With cboCourse.Value = "" optIntroduction = True chkLunch = False chkVegetarian = False txtName.SetFocus End Sub
初始化代码的工作方式:
UserForm_Initialize()过程的目的是在VBA中准备要使用的用户表单,设置各种控件的默认值并创建组合框将显示的列表。
这些行将两个文本框的内容设置为空:
txtName.Value = "" txtPhone.Value = ""
接下来是组合框的说明。首先指定列表的所有内容,然后将组合框的初始值设置为空。
With cboDepartment .AddItem "Sales" .AddItem "Marketing" (as many as necessary…) End With
cboDepartment.Value =“”
如果需要,可以从选项组中进行初始选择,在这种情况下:
optIntroduction = True两个复选框均设置为False(即无刻度)。如果希望复选框已被勾选,则设置为True:
chkLunch = False chkVegetarian = False最后,将焦点转移到第一个文本框。这会将用户光标放置在文本框中,以便他们在开始键入之前不需要单击该框:
txtName.SetFocus ===添加代码:2使按钮起作用表单上有三个命令按钮,每个命令按钮都必须由自己的过程供电。从简单的开始…
编码取消按钮:
之前,我们使用属性窗口将“取消”按钮的“取消”属性设置为_True_。将命令按钮的“取消”属性设置为True时,具有当用户按下键盘上的Esc键时“单击”该按钮的效果。但这仅不会导致表单发生任何事情。您需要为按钮的click事件创建代码,在这种情况下,它将关闭表单。方法如下:
1.在打开用户窗体以在Visual Basic编辑器中进行编辑的情况下,双击“取消”按钮。窗体的代码窗口随即打开,其中cmdCancel_Click()过程可供编辑。
2.关闭表单的代码非常简单。在过程中添加一行代码,如下所示:
Private Sub cmdCancel_Click() Unload Me End Sub
编码“清除表单”按钮:
我添加了一个按钮来清除表单,以防用户想改变主意并重设所有内容,并简化了一次要进行多次预订的情况。它所要做的就是再次运行初始化过程。通过使用Call关键字,可以告诉一个宏运行另一个宏(如果需要,可以运行一系列宏):
1.双击清除表单按钮。窗体的代码窗口打开,其中cmdClearForm_Click()过程可供编辑。
2.在该过程中添加一行代码,如下所示:
Private Sub cmdClearForm_Click() Call UserForm_Initialize End Sub
编码OK按钮:
这是一段代码,必须将用户的选择和文本输入转移到工作表上。当我们将“取消”按钮的“取消”属性设置为True时,我们还将“确定”按钮的“默认”属性设置为_True_。当用户按下键盘上的Enter(或Return)键(前提是他们没有使用Tab键跳到另一个按钮)时,这需要单击OK按钮。
这是使按钮起作用的代码:
1.双击确定按钮。窗体的代码窗口打开,其中cmdOK_Click()过程可供编辑。
2.编辑该过程以添加以下代码:
Private Sub cmdOK_Click() ActiveWorkbook.Sheets("Course Bookings").Activate Range("A1").Select Do If IsEmpty(ActiveCell) = FalseThen ActiveCell.Offset(1, 0).Select End If Loop Until IsEmpty(ActiveCell) = True ActiveCell.Value = txtName.Value ActiveCell.Offset(0, 1) = txtPhone.Value ActiveCell.Offset(0, 2) = cboDepartment.Value ActiveCell.Offset(0, 3) = cboCourse.Value If optIntroduction = True Then ActiveCell.Offset(0, 4).Value = "Intro" ElseIf optIntermediate = True Then ActiveCell.Offset(0, 4).Value = "Intermed" Else ActiveCell.Offset(0, 4).Value = "Adv" End If If chkLunch = True Then ActiveCell.Offset(0, 5).Value = "Yes" Else ActiveCell.Offset(0, 5).Value = "No" End If If chkVegetarian = True Then ActiveCell.Offset(0, 6).Value = "Yes" Else If chkLunch = False Then ActiveCell.Offset(0, 6).Value = "" Else ActiveCell.Offset(0, 6).Value = "No" End If End If Range("A1").Select End Sub
CmdOK_Click代码的工作方式:
前两行确保正确的工作簿处于活动状态,并将选择内容移至单元格A1:
ActiveWorkbook.Sheets("Course Bookings").Activate Range("A1").Select The next few lines moves the selection down the worksheet until it finds an empty cell: Do If IsEmpty(ActiveCell) = False Then ActiveCell.Offset(1, 0).Select End If Loop Until IsEmpty(ActiveCell) = True
接下来的四行开始使用活动单元格(位于A列中)作为参考,并沿行单元格一次移动:将表格的内容写到工作表上:
ActiveCell.Value = txtName.Value ActiveCell.Offset(0, 1) = txtPhone.Value ActiveCell.Offset(0, 2) = cboDepartment.Value ActiveCell.Offset(0, 3) = cboCourse.Value
现在我们来看看选项按钮。这些已放置在窗体上的框架中,因此用户只能选择一个。 IF语句用于指示Excel每个选项的含义:
If optIntroduction = True Then ActiveCell.Offset(0, 4).Value = "Intro" ElseIf optIntermediate = True Then ActiveCell.Offset(0, 4).Value = "Intermed" Else ActiveCell.Offset(0, 4).Value = "Adv" End If
VBA IF语句比Excel的IF函数更易于管理。
您可以根据需要选择多个选项,只需为每个选项插入一个额外的ElseIf。如果只有两个选项,则您不需要ElseIf,而只要If和Else就足够了(别忘了-它们都需要End If)。
每个复选框还有另一个IF语句。对于“需要午餐”复选框,该框内的对勾表示该人需要午餐,而对勾则表示他们不需要。
If chkLunch = True Then ActiveCell.Offset(0, 5).Value = "Yes" Else ActiveCell.Offset(0, 5).Value = "No" End If
我们可以对素食复选框使用类似的IF语句,但是如果该人不需要午餐,则他们是否素食是无关紧要的。无论如何,仅仅因为他们不需要午餐就认为他们不是素食者是错误的。因此,IF语句包含第二个嵌套的if语句:
If chkVegetarian = True Then ActiveCell.Offset(0, 6).Value = "Yes" Else If chkLunch = False Then ActiveCell.Offset(0, 6).Value = "" Else ActiveCell.Offset(0, 6).Value = "No" End If End If
方框中的对勾表示该人是素食主义者。如果该框中没有任何勾号,则嵌套的IF语句将查看“需要午餐”复选框。如果“需要午餐”复选框中有一个勾号,则“素食”复选框中没有任何勾号表示该人不是素食者,因此在单元格中插入“否”。但是,如果“需要午餐”复选框中没有勾选,则我们不知道该人是否是素食者(无论如何都没关系),因此该单元格保留为空白(“”)。
最后,选择返回到工作表的开头,为下一个输入做好准备:
Range(“ A1”)。Select ===添加代码3:处理表单最后,举例说明如何使用表单上的控件。设置控件属性后,“素食主义者”复选框的“已启用”属性将设置为_False_。如果未启用控件,则_user_不能在其中输入值,尽管它可以保存已经存在的值,并且VBA可以添加,删除或更改该值。
如果他们不点午餐,我们不需要知道这个人是否是素食主义者(即使他们是!)。因此,除非在“需要的午餐”复选框中打勾,否则“素食主义者”复选框将保持禁用状态。然后,用户可以随意勾选素食复选框。如果他们打勾,我们将知道他们的回答是“是”,否则,我们将知道他们的回答是“否”。
我们可以通过使一个程序在“需要午餐”复选框的值更改时自动运行,从而将Enabled属性从_False_切换到_True_。幸运的是,更多的控件具有_Change_过程,我们在此处使用的是chkLunch_Change()。我们将使用此选项在“需要午餐”复选框被选中时启用“素食”复选框,而在未选中“需要午餐”复选框时将其禁用。
我们还需要做一件事。假设某人勾选了“需要午餐”复选框,同时勾选了“素食”复选框。然后他们改变了主意,并从“需要午餐”复选框中删除了对勾。素食复选框将被禁用,但先前输入的刻度将保留。
如果禁用此复选框,则额外的一行代码可以确保删除刻度线。整个过程如下:
Private Sub chkLunch_Change() If chkLunch = True Then chkVegetarian.Enabled = True Else chkVegetarian.Enabled = False chkVegetarian = False End If End Sub
打开表单现在可以使用表单了,因此需要使用一个简单的宏来打开它。可以将其附加到自定义工具栏按钮,工作表上绘制的命令按钮或任何图形(右键单击图形并选择“分配宏”)。如有必要,为工作簿创建一个新模块并添加以下过程:
Sub OpenCourseBookingForm() frmCourseBooking.Show End Sub
如果您喜欢我们的博客,请在Facebook上与您的朋友分享。您也可以在Twitter和Facebook上关注我们。
我们很高兴收到您的来信,请让我们知道我们如何改进,补充或创新我们的工作,并为您做得更好。写信给我们[email protected]