Microsoft Lab
全部软件
Excel用户窗体(Userform)约 8 分钟

Interactive Userform 互动式表单(查找/编辑/新增)

重点内容


适用版本

桌面版通用(Excel 365 / 2021 / 2019 等)。


表单打开时,光标停在 ID 栏

Private Sub UserForm_Initialize()
  TextBox1.SetFocus
End Sub

ID 栏内容改变时,自动查找

Private Sub TextBox1_Change()
  GetData
End Sub

三个按钮分别绑定三个功能

Private Sub CommandButton1_Click()
  EditAdd
End Sub

Private Sub CommandButton2_Click()
  ClearForm
End Sub

Private Sub CommandButton3_Click()
  Unload Me
End Sub

模块层级变量(整个表单模块共用)

Dim id As Integer, i As Integer, j As Integer, flag As Boolean

GetData:根据 ID 查找并带出数据

Sub GetData()
  If IsNumeric(UserForm1.TextBox1.Value) Then
    flag = False
    i = 0
    id = UserForm1.TextBox1.Value
    Do While Cells(i + 1, 1).Value <> ""
      If Cells(i + 1, 1).Value = id Then
        flag = True
        For j = 2 To 3
          UserForm1.Controls("TextBox" & j).Value = Cells(i + 1, j).Value
        Next j
      End If
      i = i + 1
    Loop
    If flag = False Then
      For j = 2 To 3
        UserForm1.Controls("TextBox" & j).Value = ""
      Next j
    End If
  Else
    ClearForm
  End If
End Sub

ClearForm:清空所有文本框

Sub ClearForm()
  For j = 1 To 3
    UserForm1.Controls("TextBox" & j).Value = ""
  Next j
End Sub

EditAdd:找到就更新,找不到就新增

Sub EditAdd()
  Dim emptyRow As Long
  If UserForm1.TextBox1.Value <> "" Then
    flag = False
    i = 0
    id = UserForm1.TextBox1.Value
    emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1
    Do While Cells(i + 1, 1).Value <> ""
      If Cells(i + 1, 1).Value = id Then
        flag = True
        For j = 2 To 3
          Cells(i + 1, j).Value = UserForm1.Controls("TextBox" & j).Value
        Next j
      End If
      i = i + 1
    Loop
    If flag = False Then
      For j = 1 To 3
        Cells(emptyRow, j).Value = UserForm1.Controls("TextBox" & j).Value
      Next j
    End If
  End If
End Sub

逻辑说明

  • flag 是一个「有没有找到匹配 ID」的标记:找到了设成 True,循环结束后没被设过就还是 False,代表这个 ID 是新的
  • GetData 只负责「查找并显示」,EditAdd 才是真正「写回工作表」的动作——两者查找逻辑几乎一样,但一个是读、一个是写
  • 用 Controls("TextBox" & j) 动态引用控件名(见 EP08),配合 For j = 2 To 3 批量处理第 2、3 个文本框,不用为每个字段各写一段代码
📷 画面提示

运行中的表单,ID 栏输入一个已存在的编号后,另外两个文本框自动带出对应的既有数据


学完你会

常见错误

  • flag 变量没有在每次查找前重置为 False,上一次的查找结果会误判成这一次也找到了
  • GetData 和 EditAdd 两段几乎相同的查找逻辑,其中一个改了字段范围(For j = 2 To 3)却忘记同步改另一个
  • ID 栏输入非数字内容时没有导向 ClearForm,导致后续查找逻辑收到不合法的值而出错

Sources

Blog / Website:

  1. Interactive Userform
只记在你的浏览器里,换设备不会同步。