从0学Excel VBA编程 第19篇:综合案例3——交互式数据录入系统
学习目标
学会用用户窗体(UserForm)做一个能"填表录入"的小界面 学会在录入前做数据校验(空值、数字、正数),避免脏数据进表 学会加"查询"功能,输入工号自动把员工信息回填到窗体
知识点精讲
前面第 16 篇我们认识了用户窗体,学会了拖控件、写按钮代码。这一篇把它用起来——做一个办公里非常实用的小系统:交互式数据录入系统。
所谓"交互式",就是人不用直接碰单元格,而是在一个带输入框和按钮的小窗口里点一点,数据就自动写进表格;输入工号,又能把这个人查出来。本质还是我们学过的三件事拼起来:
窗体:就是那个小窗口(第 16 篇学的 UserForm + TextBox + CommandButton)。 录入:点"录入"按钮 → VBA 用 End(xlUp)找最后一行 → 写在下一行。校验:写之前先判断,工号为空?工资不是数字?小于或等于 0?不合法就弹窗提醒,绝不写进表。 查询:输入工号点"查询" → VBA 用 For循环从第 2 行往下找 → 找到就把该行的姓名、部门、工资填回窗体。
本篇用到的少量"辅助小技巧"(前面没专门讲,但很简单):
IsNumeric(文本):判断一个文本能不能当数字用,返回True/False。CDbl(文本):把"像数字的文本"转成真正的数字(比如"3000"→3000)。Call 过程名:在一个按钮里直接调用另一个按钮的代码,省得重复写(案例 3 用到了)。
准备工作:在当前工作表(比如 Sheet1)的 A1:D1 写好表头
工号 | 姓名 | 部门 | 工资,下面先空着,运行代码后自动填充。
3 个实战案例
案例 1(简单):最简易的录入窗体(姓名 + 部门)
功能说明:做一个小窗口,填"姓名"和"部门"两个框,点"录入"就自动写到表格下一行,并清空输入框等你继续填。
第一步:画窗体
按 Alt + F11打开 VBA 编辑器,点击菜单「插入」→「用户窗体」,出现一个空白窗体。从左侧"工具箱"拖两个「文本框(TextBox)」和一个「命令按钮(CommandButton)」到窗体上。 按 F4打开属性窗口,改它们的Name(名字)和Caption(按钮上显示的字):第 1 个文本框: Name = txtName第 2 个文本框: Name = txtDept按钮: Name = cmdAdd,Caption = 录入(可选)在窗体上拖两个「标签(Label)」,把 Caption分别改成"姓名""部门",摆在输入框左边更好看。
第二步:写按钮代码(双击"录入"按钮,在右侧粘贴):
Private Sub cmdAdd_Click() If txtName.Text = "" Then MsgBox "请输入姓名!", vbExclamation txtName.SetFocus Exit Sub End If Dim 最后行 As Long 最后行 = Cells(Rows.Count, 1).End(xlUp).Row Cells(最后行 + 1, 1).Value = txtName.Text Cells(最后行 + 1, 2).Value = txtDept.Text MsgBox "已录入:" & txtName.Text, vbInformation txtName.Text = "" txtDept.Text = "" txtName.SetFocusEnd Sub第三步:写打开窗体的入口(插入一个「标准模块」,粘贴):
Sub 打开录入窗体() UserForm1.ShowEnd Sub操作步骤:
按上面三步建好窗体和代码。 把光标放在 打开录入窗体过程里,按F5运行(或回到 Excel 按Alt + F8选它运行)。弹出小窗口,填姓名、部门,点"录入",表格里就多一行;空着姓名点录入会提示你补填。
案例 2(中等):带校验的员工录入窗体
功能说明:升级成"工号 / 姓名 / 部门 / 工资"四栏录入,点录入前严格校验:工号、姓名不能为空,工资必须是大于 0 的数字,任何一项不合法都弹窗提醒且不写入。
第一步:画窗体
插入用户窗体,拖 4 个文本框 + 1 个按钮,按 F4改属性:txtID(工号)、txtName(姓名)、txtDept(部门)、txtSalary(工资)按钮: Name = cmdAdd,Caption = 录入可加 4 个 Label 标注每栏含义。
第二步:写按钮代码:
Private Sub cmdAdd_Click() ' 校验工号 If txtID.Text = "" Then MsgBox "工号不能为空!", vbExclamation txtID.SetFocus Exit Sub End If ' 校验姓名 If txtName.Text = "" Then MsgBox "姓名不能为空!", vbExclamation txtName.SetFocus Exit Sub End If ' 校验工资必须是正数 If Not IsNumeric(txtSalary.Text) Then MsgBox "工资必须填数字!", vbExclamation txtSalary.SetFocus Exit Sub End If If CDbl(txtSalary.Text) <= 0 Then MsgBox "工资必须大于 0!", vbExclamation txtSalary.SetFocus Exit Sub End If Dim 最后行 As Long 最后行 = Cells(Rows.Count, 1).End(xlUp).Row Cells(最后行 + 1, 1).Value = txtID.Text Cells(最后行 + 1, 2).Value = txtName.Text Cells(最后行 + 1, 3).Value = txtDept.Text Cells(最后行 + 1, 4).Value = CDbl(txtSalary.Text) MsgBox "录入成功!", vbInformation txtID.Text = "" txtName.Text = "" txtDept.Text = "" txtSalary.Text = "" txtID.SetFocusEnd Sub第三步:写入口(标准模块):
Sub 打开员工录入() UserForm1.ShowEnd Sub操作步骤:
建好四栏窗体和上面代码,确保工作表 A1:D1 表头为 工号 | 姓名 | 部门 | 工资。运行 打开员工录入,逐项填写,点"录入"——不合法会立刻被拦下,合法才写进下一行。试一下:工资填"abc"或"0"或"-5",都会弹窗提醒;填"5000"则正常录入。
案例 3(实用小案例):完整交互式录入与查询系统
功能说明:在案例 2 基础上,再增加"查询"和"清空"两个按钮——输入工号点查询,自动把该员工的姓名/部门/工资回填到窗体;点清空一键重置所有输入框。这就成了一个真正能录入、能查询的小系统。
第一步:画窗体
在案例 2 的窗体上,再加两个按钮,按 F4改属性:按钮 2: Name = cmdSearch,Caption = 查询按钮 3: Name = cmdClear,Caption = 清空四个文本框的 Name保持txtID、txtName、txtDept、txtSalary不变。
第二步:写三个按钮的代码(双击对应按钮,分别粘贴):
Private Sub cmdAdd_Click() If txtID.Text = "" Then MsgBox "工号不能为空!", vbExclamation txtID.SetFocus Exit Sub End If If txtName.Text = "" Then MsgBox "姓名不能为空!", vbExclamation txtName.SetFocus Exit Sub End If If Not IsNumeric(txtSalary.Text) Or CDbl(txtSalary.Text) <= 0 Then MsgBox "工资必须填大于 0 的数字!", vbExclamation txtSalary.SetFocus Exit Sub End If Dim 最后行 As Long 最后行 = Cells(Rows.Count, 1).End(xlUp).Row Cells(最后行 + 1, 1).Value = txtID.Text Cells(最后行 + 1, 2).Value = txtName.Text Cells(最后行 + 1, 3).Value = txtDept.Text Cells(最后行 + 1, 4).Value = CDbl(txtSalary.Text) MsgBox "录入成功!", vbInformation Call cmdClear_Click ' 录入完直接清空,方便下一位End SubPrivate Sub cmdSearch_Click() If txtID.Text = "" Then MsgBox "请输入要查询的工号!", vbExclamation txtID.SetFocus Exit Sub End If Dim 最后行 As Long, i As Long 最后行 = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To 最后行 If Cells(i, 1).Value = txtID.Text Then txtName.Text = Cells(i, 2).Value txtDept.Text = Cells(i, 3).Value txtSalary.Text = Cells(i, 4).Value MsgBox "已找到该员工信息!", vbInformation Exit Sub End If Next i MsgBox "没有找到工号为 " & txtID.Text & " 的员工。", vbExclamationEnd SubPrivate Sub cmdClear_Click() txtID.Text = "" txtName.Text = "" txtDept.Text = "" txtSalary.Text = "" txtID.SetFocusEnd Sub第三步:写入口(标准模块):
Sub 打开员工系统() UserForm1.ShowEnd Sub操作步骤:
按上面建好带三个按钮的窗体,确保 A1:D1 表头为 工号 | 姓名 | 部门 | 工资。运行 打开员工系统,先录入几条员工记录。在"工号"框输入一个已录入的工号,点"查询"——姓名、部门、工资自动回填;输错工号会提示"没找到"。 点"清空"可一键清掉所有输入框,继续下一位员工。
本篇小结
交互式系统 = 窗体收集输入 + VBA 校验 + 写入/查询工作表,全程不用手动改单元格。 校验是录入质量的命门:空值、非数字、非正数都要在写表前拦下。 IsNumeric+CDbl是处理"输入框文本"变"真数字"的黄金搭档。For i = 2 To 最后行配合Cells(i,1).Value = 工号就能实现"按工号查人";Call 另一按钮可复用清空逻辑。
下一篇内容预告
第 20 篇:总结与进阶学习路径(回顾 1–19 篇知识地图,给出继续深造的方向与资源,为整套教程收尾)
夜雨聆风