乐于分享
好东西不私藏

从0学Excel VBA编程 第19篇:综合案例3——交互式数据录入系统

从0学Excel VBA编程 第19篇:综合案例3——交互式数据录入系统

从0学Excel VBA编程 第19篇:综合案例3——交互式数据录入系统

学习目标

  1. 学会用用户窗体(UserForm)做一个能"填表录入"的小界面
  2. 学会在录入前做数据校验(空值、数字、正数),避免脏数据进表
  3. 学会加"查询"功能,输入工号自动把员工信息回填到窗体

知识点精讲

前面第 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(简单):最简易的录入窗体(姓名 + 部门)

功能说明:做一个小窗口,填"姓名"和"部门"两个框,点"录入"就自动写到表格下一行,并清空输入框等你继续填。

第一步:画窗体

  1. 按 Alt + F11 打开 VBA 编辑器,点击菜单「插入」→「用户窗体」,出现一个空白窗体。
  2. 从左侧"工具箱"拖两个「文本框(TextBox)」和一个「命令按钮(CommandButton)」到窗体上。
  3. 按 F4 打开属性窗口,改它们的 Name(名字)和 Caption(按钮上显示的字): 
    • 第 1 个文本框:Name = txtName
    • 第 2 个文本框:Name = txtDept
    • 按钮:Name = cmdAddCaption = 录入
  4. (可选)在窗体上拖两个「标签(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

操作步骤

  1. 按上面三步建好窗体和代码。
  2. 把光标放在 打开录入窗体 过程里,按 F5 运行(或回到 Excel 按 Alt + F8 选它运行)。
  3. 弹出小窗口,填姓名、部门,点"录入",表格里就多一行;空着姓名点录入会提示你补填。

案例 2(中等):带校验的员工录入窗体

功能说明:升级成"工号 / 姓名 / 部门 / 工资"四栏录入,点录入前严格校验:工号、姓名不能为空,工资必须是大于 0 的数字,任何一项不合法都弹窗提醒且不写入。

第一步:画窗体

  1. 插入用户窗体,拖 4 个文本框 + 1 个按钮,按 F4 改属性: 
    • txtID(工号)、txtName(姓名)、txtDept(部门)、txtSalary(工资)
    • 按钮:Name = cmdAddCaption = 录入
  2. 可加 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

操作步骤

  1. 建好四栏窗体和上面代码,确保工作表 A1:D1 表头为 工号 | 姓名 | 部门 | 工资
  2. 运行 打开员工录入,逐项填写,点"录入"——不合法会立刻被拦下,合法才写进下一行。
  3. 试一下:工资填"abc"或"0"或"-5",都会弹窗提醒;填"5000"则正常录入。

案例 3(实用小案例):完整交互式录入与查询系统

功能说明:在案例 2 基础上,再增加"查询"和"清空"两个按钮——输入工号点查询,自动把该员工的姓名/部门/工资回填到窗体;点清空一键重置所有输入框。这就成了一个真正能录入、能查询的小系统。

第一步:画窗体

  1. 在案例 2 的窗体上,再加两个按钮,按 F4 改属性: 
    • 按钮 2:Name = cmdSearchCaption = 查询
    • 按钮 3:Name = cmdClearCaption = 清空
  2. 四个文本框的 Name 保持 txtIDtxtNametxtDepttxtSalary 不变。

第二步:写三个按钮的代码(双击对应按钮,分别粘贴):

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

操作步骤

  1. 按上面建好带三个按钮的窗体,确保 A1:D1 表头为 工号 | 姓名 | 部门 | 工资
  2. 运行 打开员工系统,先录入几条员工记录。
  3. 在"工号"框输入一个已录入的工号,点"查询"——姓名、部门、工资自动回填;输错工号会提示"没找到"。
  4. 点"清空"可一键清掉所有输入框,继续下一位员工。

本篇小结

  • 交互式系统 = 窗体收集输入 + VBA 校验 + 写入/查询工作表,全程不用手动改单元格。
  • 校验是录入质量的命门:空值、非数字、非正数都要在写表前拦下。
  • IsNumeric + CDbl 是处理"输入框文本"变"真数字"的黄金搭档。
  • For i = 2 To 最后行 配合 Cells(i,1).Value = 工号 就能实现"按工号查人";Call 另一按钮 可复用清空逻辑。

下一篇内容预告

第 20 篇:总结与进阶学习路径(回顾 1–19 篇知识地图,给出继续深造的方向与资源,为整套教程收尾)