标签: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社群下载中文示例工作簿。