“课程预订表”是一个简单的表单,说明了用户表单设计的原理以及相关的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]