用户窗体示例:工作表数据与用户窗体的交互

标签:VBA,用户窗体

好的网站是非常优秀的学习资源,认真研究其分享的知识是我们快速提高水平的方法之一。这个示例仍然来自于thesmallman.com,演示了用户窗体如何与工作表中的数据进行交互:如何使用Excel工作表中的数据填充用户窗体,并将编辑后的数据发送回工作表;并且在这个例中,只需在用户窗体中输入一个关键字,然后单击回车键将自动填充用户窗体。

建立一个好的用户窗体的关键是结构。理想情况下,用户窗体中的项目应该具有逻辑布局,以便在编写代码以将用户窗体信息发送到数据集时,可以使用顺序循环,而不是未排序的循环。例如,本示例的用户窗体演示如下图1所示。

图1

这个用户窗体中的Textbox1(文本框1)应该是数据库第1列中的信息,Textbox2(文本框2)应位于第2列,依此类推。这听起来很合乎逻辑,但你会惊讶地发现,很少有用户窗体是用这种简单的逻辑来设置的。不知道为什么!

在这个示例中,我们会添加一些非常简洁的逻辑。如果输入有效的注册号(在textbox1中)并按Enter键(回车键),则将预填充这个用户窗体。

如上图1所示,我输入注册号101后按回车键,数据填充了这个用户窗体,完成这个操作的程序如下:

Private Sub editstudent1_KeyDown( _

ByVal KeyCode As MSForms.ReturnInteger, _

ByVal Shift As Integer)

If KeyCode = vbKeyReturn Then

Findit

End If

End Sub

这个过程在单击回车键后调用Findit过程:

'查找并填充记录

Private Sub Findit()

Dim fnd As Range

Dim Search As String

Dim sh As Worksheet

Dim i As Integer

Set sh = Sheet2

Search = editstudent1.Text

Set fnd = sh.Columns("A:A").Find(Search, , , xlWhole)

If fnd Is Nothing Then

MsgBox "没有找到记录", , "错误"

editstudent1.Text = ""

frmeditrecord.Hide

Else

For i = 2 To 13

frmeditrecord.Controls("editstudent" & i).Text = sh.Cells(fnd.Row, i).Value

Next i

End If

End Sub

上面的Findit过程检查名为editstudent1的texbox1中的项。如果找到了这些项目,则会使用该唯一注册号中的记录填充用户窗体。如果找不到该注册号,将显示错误消息。

编辑用户窗体后,有一个“更新”按钮。单击此按钮,会将数据发送回包含数据的工作表,并使用你所做的任何更改对其进行更新。

Private Sub cmdUpdate_Click()

Dim fnd As Range

Dim Search As String

Dim sh As Worksheet

Dim i As Integer

Dim ctl As Object

Set sh = Sheet2

Search = editstudent1.Text

Set fnd = sh.Columns("A:A").Find(Search, , , xlWhole)

For i = 2 To 13

sh.Cells(fnd.Row, i).Value = frmeditrecord.Controls("editstudent" & i).Text

Next i

'清理用户窗体控件

For Each ctl In Me.Controls

If TypeName(ctl) = "TextBox" Then ctl.Value = Null

Next ctl

End Sub

正如你所见,上述过程与将信息填充用户窗体的过程相反。

如有兴趣的朋友,可以直接到该网站下载原始示例工作簿,或者到知识星球App完美Excel社群下载中文示例工作簿。