VBA自学应用(2)——制作简单的数据录入窗口

本文详细介绍如何使用VBA在Excel中创建数据录入窗体,包括窗体设计、代码编写、工作表事件激活及滚轮功能实现。通过实例演示,读者可掌握从零开始构建高效数据录入界面的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现如今有两张表,一张产品表,一张录入表,如图所示。
在这里插入图片描述
在这里插入图片描述
我们要做出如下效果:
在这里插入图片描述
达成这样的效果其实也不难,就让我们一步步来!

一、画一个你的窗体

  1. 首先在标签栏找到开发工具中的VB编辑器并打开

在这里插入图片描述

  1. 然后右键新建一个用户窗体

在这里插入图片描述

  1. 然后选中窗体模块,按F4打开窗体属性窗口(也可以在视图选项卡中打开),这里可以设置窗体的各种属性

在这里插入图片描述

  1. 接下来在视图选项卡下找到工具箱,用工具箱画出所需要的控件

在这里插入图片描述

二、编写窗体代码

  1. 先双击窗体,在如图所示的地方找到UserForm对应的事件(UserForm_Initialize=窗体名称_事件)

在这里插入图片描述
在这里插入图片描述
写入以下代码

Private Sub UserForm_Initialize()
    arr = Sheets("产品表").Range("a1").CurrentRegion
    With ListBox1
    '设置列表框属性
        .List = arr
        .MultiSelect = fmMultiSelectExtended
        .ColumnCount = UBound(arr, 2)
        .ListStyle = fmListStyleOption
        LISTBOX_Post_Flag = 1
        LISTBOX_Mouse_Flag = 1
    End With
End Sub

当然你也可以直接在列表框的属性窗口中设置他的属性

  1. 第二步,按照上述方法找到ListBox1_DblClick,写入以下代码
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    '双击的时候也可以更改数据
    Dim crr()
    Dim m As Long
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
            m = m + 1
            ReDim Preserve crr(1 To ListBox1.ColumnCount, 1 To m)
            For j = 0 To ListBox1.ColumnCount - 1
                crr(j + 1, m) = ListBox1.List(i, j)
            Next
        End If
    Next
    If m > 0 Then ActiveCell.Resize(m, j) = Application.Transpose(crr)
End Sub
  1. 第三步,为你需要查找的项目进行模糊匹配设置代码
Private Sub TextBox1_Change()
    '模糊匹配
    Dim drr()
    Dim n As Long
    arr = Sheets("产品表").Range("A1").CurrentRegion
    For i = 1 To UBound(arr)
        If InStr(CStr(arr(i, 1)), TextBox1.Text) > 0 Then
            n = n + 1
            ReDim Preserve drr(1 To ListBox1.ColumnCount, 1 To n)
            For j = 1 To UBound(arr, 2)
                drr(j, n) = arr(i, j)
            Next
        End If
    Next
    If n > 1 Then
        ListBox1.List = Application.Transpose(drr)
    ElseIf n = 1 Then
        ReDim crr(1 To 1, 1 To UBound(drr))
        For i = 1 To UBound(drr)
            crr(1, i) = drr(i, 1)
        Next
        ListBox1.List = crr
    Else
        ListBox1.Clear
    End If
End Sub
  1. 第四步,为关闭和录入按钮编写代码
  • 关闭
Private Sub CommandButton2_Click()
    Unload Me
End Sub
  • 录入
Private Sub CommandButton1_Click()
    '录入
    
    Dim brr(), grr
    Dim k As Long, m As Long
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
            k = k + 1
            ReDim Preserve brr(1 To ListBox1.ColumnCount, 1 To k)
            For j = 0 To ListBox1.ColumnCount - 1
                brr(j + 1, k) = ListBox1.List(i, j)
                '选中的数据存入数组brr
            Next
        End If
    Next
    If k = 0 Then MsgBox "请选择数据": Exit Sub
    grr = Application.Transpose(brr)
    If k > 0 Then
        If k = 1 Then
            For i = 1 To UBound(grr)
                
                ActiveCell.Offset(, m) = grr(i)
                m = m + 1
            Next
            ActiveCell.Offset(1).Select
        Else
            For i = 1 To UBound(grr)
                For j = 1 To UBound(grr, 2)
                    ActiveCell.Offset(, m) = grr(i, j)
                    m = m + 1
                Next
                ActiveCell.Offset(1).Select
                m = 0
            Next
        End If
    End If
    '取消选中
    Cells(Rows.Count, "B").End(3).Offset(1).Select
End Sub
  • 这里可以使用小技巧取消窗口自带的关闭按钮事件,找到对应事件键入以下代码就可以啦!
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> vbFormCode Then Cancel = True
End Sub

三、使用工作表事件激活窗体

右键双击对应工作表
在这里插入图片描述
按照找窗体事件的方法找到BeforeDoubleClick事件,代码如下

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Intersect(Target, Range("b5:b100")) Is Nothing Then Exit Sub
    Cancel = True
    UserForm1.Show Model
End Sub

四、补充:关于鼠标在listbox中的滚轮实现

相关代码请移步→列表框实现鼠标滚轮滚动Demo

  • 首先,在上述代码的模块之下,定义一个变量,如图所示
    在这里插入图片描述
  • 第二步,将图示部分改成你定义的变量名称
  • 在这里插入图片描述
    在这里插入图片描述
  • 最后,只需要在对应listbox的mousemove事件下键入如下代码即可以实现滚轮效果
Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    HookListBoxScroll
    Set frmlistbox = Userform1.ListBox1
End Sub
Private Sub ListBox2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    HookListBoxScroll
    Set frmlistbox = Userform1.ListBox2
End Sub
VBA体中使用扫码枪扫码录入数据并与基础信息进行比对,可以实现自动化数据录入和验证。以下是一个简单的步骤和示例代码,帮助你实现这一功能: ### 步骤: 1. **创建VBA体**: - 打开Excel,按`Alt + F11`进入VBA编辑器。 - 插入一个新的用户体(UserForm)。 2. **添加控件**: - 在体上添加一个文本框(TextBox)用于显示扫码结果,命名为`txtScanResult`。 - 添加一个按钮(CommandButton)用于触发比对操,命名为`btnCompare`。 3. **编写代码**: - 双击体进入代码窗口,编写以下代码: ```vba Private Sub UserForm_Initialize() ' 初始化时设置焦点到扫码结果显示框 Me.txtScanResult.SetFocus End Sub Private Sub txtScanResult_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) ' 检测回车键按下 If KeyCode = vbKeyReturn Then Call CompareData End If End Sub Private Sub CompareData() Dim scanData As String Dim baseData As String Dim found As Boolean ' 获取扫码结果 scanData = Me.txtScanResult.Text ' 在基础数据中查找匹配项 found = False For i = 2 To 10 ' 假设基础数据在Sheet1的A列,从第2行开始 baseData = ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value If scanData = baseData Then found = True MsgBox "数据匹配成功!" Exit For End If Next i If Not found Then MsgBox "数据匹配失败!" End If ' 清空扫码结果显示框 Me.txtScanResult.Text = "" Me.txtScanResult.SetFocus End Sub ``` ### 说明: 1. **UserForm_Initialize**: - 体初始化时,将焦点设置到扫码结果显示框。 2. **txtScanResult_KeyDown**: - 监测键盘事件,当用户按下回车键时,调用`CompareData`方法进行数据比对。 3. **CompareData**: - 获取扫码结果。 - 在基础数据中查找匹配项。假设基础数据在`Sheet1`的A列,从第2行开始。 - 如果找到匹配项,显示“数据匹配成功!”;否则,显示“数据匹配失败!”。 - 清空扫码结果显示框并重新设置焦点。 ### 使用方法: 1. 在Excel中输入基础数据到`Sheet1`的A列。 2. 打开VBA体(可以通过另一个按钮或快捷键调用)。 3. 使用扫码枪扫描条码,扫描结果会显示在文本框中。 4. 按下回车键,系统会自动比对数据并显示结果。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

star星梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值