目录
题
码
窗体控件与工作表的交互
窗体的事件
窗体中ControIs集合访问控件
控件的排列
使用控件数组进行赋值
题
如图所示,该表为某公司订单记录表,其中所有的列都是必填的,订单编号为自动生成的序列号。如何建立窗体,并通过窗体向该表内添加订单。
| 编号 | 客户名称 | 订单日期 | 需求日期 | 型号 | 数量 |
| 1 | 上海依柯塞尔有限公司 | 2012/1/1 | 2012/1/8 | A1 | 12 |
| 2 | 上海依柯塞尔有限公司 | 2012/1/2 | 2012/1/9 | A2 | 13 |
| 3 | 上海依柯塞尔有限公司 | 2012/1/3 | 2012/1/10 | A3 | 14 |
| 4 | 上海依柯塞尔有限公司 | 2012/1/4 | 2012/1/11 | A4 | 15 |
| 5 | 上海依柯塞尔有限公司 | 2012/1/5 | 2012/1/12 | A5 | 16 |
| 6 | 上海依柯塞尔有限公司 | 2012/1/6 | 2012/1/13 | A6 | 17 |
| 7 | 上海依柯塞尔有限公司 | 2012/1/7 | 2012/1/14 | A7 | 18 |
| 8 | 上海依柯塞尔有限公司 | 2012/1/7 | 2012/1/14 | A7 | 18 |
码
创建一个窗体,并在窗体中添加与工作表所需填写的数据列数相等的文本框与标签控件,然后添加一个按钮作为“保存”按钮。在“保存”按钮中添加Click事件,逐个读取文本框的Value属性,将其赋值给工作表中的各列。
步骤1 按组合键【Alt+F11】打开VBE。
步骤2 选择菜单“插入”→“用户窗体”,并在窗体中添加5个Label控件和5个TextBox控件,以及1个CommandButton控件。
步骤3 在“工程资源管理器”中右键单击之前插入的窗体,选择“查看代码”,然后在代码编辑框中输入以下代码。
Option Explicit
'窗体初始化事件
Private Sub UserForm_Initialize()
Dim ctlIndex As Integer
With Me
.Caption = "数据录入"
.CommandButton1.Caption = "录入"
For ctlIndex = 1 To 5
'label控件
With .Controls("Label" & ctlIndex)
.Left = 22
.Top = 22 * (ctlIndex - 1) + 12
.Height = 18
.Width = 50
.Caption = Sheet1.Cells(1, ctlIndex + 1).Value
End With
'textbox控件
With .Controls("TextBox" & ctlIndex)
.Left = 80
.Top = 22 * (ctlIndex - 1) + 12
.Height = 18
.Width = 100
End With
Next ctlIndex
End With
End Sub
'按钮事件
Private Sub CommandButton1_Click()
Dim rowNew As Long
Dim ctlIndex As Integer
With Sheet1
'获取添加新数据的行号
rowNew = .Columns.Find("*", .Range("A1"), SearchDirection:=xlPrevious).Row + 1
'填写序号
.Cells(rowNew, 1).Value = rowNew - 1
'遍历数据列和TextBox控件
For ctlIndex = 1 To 5
.Cells(rowNew, ctlIndex + 1).Value = Me.Controls("Textbox" & ctlIndex).Text
Next ctlIndex
End With
End Sub
步骤4 返回工作表界面,添加一个ActiveX按钮控件“显示窗体”,并为其添加单击事件代码如下,然后退出“设计模式”。
Option Explicit
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
步骤5 单击“显示窗体”按钮,在窗体的文本框中输入内容后,单击“录入”按钮,即可将窗体中的内容写入工作表中,如图。
窗体控件与工作表的交互
窗体控件与工作表是可以进行交互的。开发者可以通过窗体控件的属性,方便地读取其中所需的值,然后赋值给工作表中的单元格或者任何希望赋值的对象;也可以将其他对象中所需传递的值赋值给工作表中的单元格。
本例中,由于使用可以输入字符的TextBox控件,可以通过其Text属性或者Value属性获取在文本框中的内容。为了便于赋值,一般可以将TextBox控件取名为TextBoxN的形式,其中N表示该文本框相应的数据在工作表中的列。因而,可以通过循环进行批量赋值。
窗体的事件
本例中,窗体的Initialize事件中添加了读取各个数据标题的代码以赋值给Label控件,并对其中的各个控件进行了排列。该Initialize事件在窗体加载时发生,一般可以在其中进行窗体的一些初始化工作,尤其是一些排版或者标签赋值的工作。窗体还有许多非常有用的事件,见表。
| 事 件 | 说 明 |
| Click() | 单击窗体区域(标题除外)事件 |
| DblClick(ByVal Cancel As MSForms.ReturnBoolean) | 双击窗体区域(标题除外)事件 |
| Activate() | 激活事件。当窗体获取焦点后被触发,类似于工作表的Activate事件 |
| Deactivate() | 失去激活状态事件。当窗体失去焦点后被触发,类似于工作表的Deacitvate事件 |
| Initialize() | 初始化事件。当窗体装载时触发 |
| QueryClose(Cancel As Integer,CloseMode as Integer) | 关闭事件。在窗体关闭前而未真正关闭时触发,可以通过Cancel参数取消关闭 |
| Terminate() | 终止事件,当窗体卸载后触发 |
| KeyDown(ByVal KeyCode As MSForms.RetunInteger,ByVal Shift As lnteger) | 键盘键接下事件。当健盘键按下后触发 |
| KeyUp(ByVal KeyCode As MSForms.ReturnInteger,ByVal Shift As Integer) | 键盘键弹起事件。当键盘键弹起后触发 |
| KeyPress(ByVal KeyAscii As MSForms.Returninteger) | 敲击键盘键事件。当敲击键盘键后触发,一个完整的敲击事件包括键盘键按下和键盘键弹起 |
| MouseDown(Byval Button As integer, ByVal Shift As integer, ByVal X As Single,ByvaL Y As Singe) | 鼠标按下事件.当鼠标的某个键被按下时触按 |
| MouseUp(ByVal Button As integer, ByVal Shift As integer, ByVal X As Single,ByVaL Y As Single) | 鼠标键弹起事件。当鼠标的某个键弹起时触发 |
| MouseMove(ByVal Button As integer, ByVal Shift As integer, ByVal X As Single,ByVal Y As Single) | 鼠标移动事件。当鼠标在控件上移动时触发。 |
窗体中ControIs集合访问控件
窗体中的所有控件都属于窗体Controls集合。当需要访问各个控件时,可以使用以下表达式:
UserForm.Controls(index)
该表达式可以返回一个窗体控件对象,其中,UserForm为窗体对象。
参数index可以为控件的顺序号(从0开始),或者可以是控件的名称。
默认情况下,窗体中控件的名称与工作表中ActiveX控件的名称命名一致,采用“控件类型”+顺序号组成(从1开始)的格式。因而本例中,实际使用了控件的名称来访问各个控件,从而更改其属性。
控件的排列
本例演示了如何使用代码排列各个控件。当控件的位置和名称具有规律时,则该过程只需要一个简单的图示和一些简单的数学计算就能完成。如图所示的实例演示了如何计算控件的Top属性。
使用该方法可以准确地排列各个控件,并调整窗体的大小。
使用控件数组进行赋值
本例使用了循环的方式将控件的值赋值给单元格区域。当单元格连续时,实际上可以采用控件数组完成。控件数组的概念实际上是VB中的一个概念,在Excel VBA中并不具备此功能。此处所描述的控件数组实际是将数组中各个控件对象组成一个数组。当需要赋值给工作表时,则可以使用该数组进行直接赋值。但该数组的作用域必须是整个窗体(即声明在窗体中,并独立于各个过程之外)。可以参考以下窗体代码实现赋值:
'定义控件数组
dim arrCtl(1 to 5) As Object
'窗体初始化事件
Private Sub UserForm_Initialize
'变量声明,控件序号
Dim ctlIndex As Integer
'操作窗体
With Me
...
For ctlIndex =1 To 5
Set arrctl(cltIndex)=.Controls("TextBox" & ctlIndex)
Next ctlIndex
End With
End Sub
'按钮单击事件
Private Sub Commandbutton1_Click()
dim rowNew As Long
...
Sheet1.cells(rowNew,2).resize(1,5).value=arrCtl
End Sub



