不想用户手抖输错数?给 Access 文本框加个 +/- 按钮
摘要: 用文本框加两个命令按钮,写 100 行 VBA 实现点击加减数字的效果,适合商品数量、价格、库存等输入场景。access开发|access培训|access框架|请添加edonsoft。
Hi,大家好!
做电商订单或者库存管理,用户手动输入数量经常打错。如果旁边放两个 + 和 - 按钮,点一下数字就变,出错率会低很多。
Access 没有现成的控件,但用文本框加两个命令按钮就能实现。下面按步骤做一个。
第一步:建窗体,放控件
打开 Access,新建一个空白窗体,切换到设计视图。
在窗体上放这些控件:
- 文本框:命名为
txtNumber,用来显示数字 - 命令按钮:命名为
btnIncrement,标题改成+ - 命令按钮:命名为
btnDecrement,标题改成-
布局建议:文本框在左边,两个按钮竖着排在右边,像这样:

保存窗体,命名为 Form_NumberInput。
第二步:添加代码
2.1 新建标准模块
按 Alt+F11 打开 VBA 编辑器,点击菜单「插入」→「模块」,新建一个模块,命名为 Module_NumberInput。
把下面的完整代码粘贴进去:
Attribute VB_Name = "Module_NumberInput"
Option Compare Database
Option Explicit
' 递增值
Public Sub IncrementValue(txt As TextBox, _
Optional stepValue As Double = 1, _
Optional minValue As Variant = Nothing, _
Optional maxValue As Variant = Nothing)
Dim currentVal As Double, newVal As Double
On Error Resume Next
currentVal = CDbl(Nz(txt.Value, 0))
On Error GoTo 0
newVal = currentVal + stepValue
If Not IsEmpty(maxValue) Then
If newVal > maxValue Then newVal = maxValue
End If
txt.Value = newVal
End Sub
' 递减值
Public Sub DecrementValue(txt As TextBox, _
Optional stepValue As Double = 1, _
Optional minValue As Variant = Nothing, _
Optional maxValue As Variant = Nothing)
Dim currentVal As Double, newVal As Double
On Error Resume Next
currentVal = CDbl(Nz(txt.Value, 0))
On Error GoTo 0
newVal = currentVal - stepValue
If Not IsEmpty(minValue) Then
If newVal < minValue Then newVal = minValue
End If
txt.Value = newVal
End Sub
' 应用样式
Public Sub ApplyNumberInputStyle(txt As TextBox, _
btnIncrement As CommandButton, _
btnDecrement As CommandButton)
' 文本框
With txt
.FontSize = 11
.FontName = "Segoe UI"
.TextAlign = 2
.Height = 360
End With
' 递增按钮
With btnIncrement
.Width = 280
.Height = 180
.Caption = "+"
.FontSize = 14
.FontName = "Segoe UI"
.BackColor = RGB(240, 240, 240)
.ForeColor = RGB(80, 80, 80)
End With
' 递减按钮
With btnDecrement
.Width = 280
.Height = 180
.Caption = "-"
.FontSize = 16
.FontName = "Segoe UI"
.BackColor = RGB(240, 240, 240)
.ForeColor = RGB(80, 80, 80)
End With
End Sub
' 格式化显示
Public Sub FormatNumberDisplay(txt As TextBox, _
Optional decimalPlaces As Integer = 0, _
Optional showThousandSeparator As Boolean = False)
Dim formatStr As String
If showThousandSeparator Then
formatStr = "#,##0"
Else
formatStr = "0"
End If
If decimalPlaces > 0 Then
formatStr = formatStr & "." & String(decimalPlaces, "0")
End If
txt.Format = formatStr
End Sub
保存模块。
2.2 写窗体代码
回到窗体设计视图,双击窗体空白处打开代码窗口,粘贴以下代码:
Option Compare Database
Option Explicit
' 窗体加载
Private Sub Form_Load()
' 应用样式
Module_NumberInput.ApplyNumberInputStyle Me.txtNumber, Me.btnIncrement, Me.btnDecrement
' 设置初始值
Me.txtNumber.Value = 0
End Sub
' 递增按钮
Private Sub btnIncrement_Click()
Module_NumberInput.IncrementValue Me.txtNumber, 1, 0, 100
End Sub
' 递减按钮
Private Sub btnDecrement_Click()
Module_NumberInput.DecrementValue Me.txtNumber, 1, 0, 100
End Sub
保存窗体。
第三步:运行测试
关闭设计视图,打开窗体。
你会看到:
- 文本框显示
0 - 右边两个灰色按钮,一个显示
+,一个显示- - 点击
+按钮,数字变成1、2、3... - 点击
-按钮,数字变成2、1、0 - 到
100时点+不再增加 - 到
0时点-不再减少
如果效果正常,说明代码运行成功。
第四步:代码讲解
模块代码的作用
Module_NumberInput 里有四个函数:
1. IncrementValue(递增)
接收四个参数:
txt- 要操作的文本框stepValue- 每次加多少(默认 1)minValue- 最小值(可选)maxValue- 最大值(可选)
逻辑:读取文本框当前值 → 加上步进值 → 检查是否超过最大值 → 写回文本框。
用 Nz(txt.Value, 0) 处理空值,如果文本框是空的就按 0 算。用 IsEmpty(maxValue) 检查是否传了最大值参数。
2. DecrementValue(递减)
和 IncrementValue 一样,只是改成减法,检查最小值。
3. ApplyNumberInputStyle(应用样式)
设置文本框和按钮的字体、大小、颜色。
- 文本框:11 号字,居中对齐,高度 360
- 按钮:灰色背景 RGB(240,240,240),+ 号 14 号字,- 号 16 号字
你可以按自己需要改颜色和尺寸。
4. FormatNumberDisplay(格式化)
控制数字显示格式:
decimalPlaces- 小数位数,0 就是整数showThousandSeparator- 是否显示千分位
比如 5000 显示成 5,000,19.5 显示成 19.50。

窗体代码的作用
Form_Load 事件
窗体打开时调用 ApplyNumberInputStyle 设置样式,把初始值设为 0。
按钮点击事件
调用模块里的 IncrementValue 或 DecrementValue,传入文本框、步进值、最小值、最大值。
这里设置的是:每次加减 1,范围 0 到 100。
扩展用法
根据实际场景调整参数。
价格输入(小数,步进 0.5)
Private Sub Form_Load()
Module_NumberInput.ApplyNumberInputStyle Me.txtPrice, Me.btnPriceUp, Me.btnPriceDown
Me.txtPrice.Value = 0
Module_NumberInput.FormatNumberDisplay Me.txtPrice, 2, False ' 2 位小数
End Sub
Private Sub btnPriceUp_Click()
Module_NumberInput.IncrementValue Me.txtPrice, 0.5, 0, 999.99
End Sub
Private Sub btnPriceDown_Click()
Module_NumberInput.DecrementValue Me.txtPrice, 0.5, 0, 999.99
End Sub
库存数量(大步进,千分位)
Private Sub Form_Load()
Module_NumberInput.ApplyNumberInputStyle Me.txtStock, Me.btnStockUp, Me.btnStockDown
Me.txtStock.Value = 0
Module_NumberInput.FormatNumberDisplay Me.txtStock, 0, True ' 千分位
End Sub
Private Sub btnStockUp_Click()
Module_NumberInput.IncrementValue Me.txtStock, 10, 0, 10000 ' 每次加减 10
End Sub
Private Sub btnStockDown_Click()
Module_NumberInput.DecrementValue Me.txtStock, 10, 0, 10000
End Sub
百分比(步进 5)
Private Sub Form_Load()
Module_NumberInput.ApplyNumberInputStyle Me.txtPercent, Me.btnPercentUp, Me.btnPercentDown
Me.txtPercent.Value = 0
End Sub
Private Sub btnPercentUp_Click()
Module_NumberInput.IncrementValue Me.txtPercent, 5, 0, 100
End Sub
Private Sub btnPercentDown_Click()
Module_NumberInput.DecrementValue Me.txtPercent, 5, 0, 100
End Sub
Private Sub txtPercent_LostFocus()
Me.txtPercent.Format = "0\%" ' 显示百分号
End Sub
几个问题
如果不需要限制范围怎么办?
不传最小值和最大值参数:
Module_NumberInput.IncrementValue Me.txtNumber, 1
用户手动输入怎么验证?
在文本框的 LostFocus 事件里重新格式化:
Private Sub txtNumber_LostFocus()
If Val(Me.txtNumber.Value) > 100 Then Me.txtNumber.Value = 100
If Val(Me.txtNumber.Value) < 0 Then Me.txtNumber.Value = 0
Module_NumberInput.FormatNumberDisplay Me.txtNumber, 0, False
End Sub
为什么不用 Access 自带的 Spin Button?
Spin Button 样式老旧,只能输出整数,还得单独绑定文本框。用这套方案样式可控,逻辑也清楚。
总结
整个实现就是四步:
- 建窗体,放控件:一个文本框 + 两个命令按钮
- 添加代码:模块里写增减和样式函数,窗体里调用
- 运行测试:打开窗体,点按钮看效果
- 代码讲解:理解增减逻辑、样式设置、格式化方法
代码不到 100 行,支持整数、小数、千分位、百分比,自动限制最小最大值。适合电商订单、库存管理、财务报表这些需要频繁输入数字的场景。
完整代码在项目的 access-number-input 文件夹,导入 Module_NumberInput.bas 就能用。
如果你在 Access 开发里遇到类似的输入体验问题,欢迎公众号后台留言,我看到了会回。
技术培训
- Access VBA 从入门到精通(线上/线下均可)
- Access + SQL Server 企业级开发实战
- Access 系统性能优化与架构设计
- AI + Access 融合开发专题培训
定制开发
- 企业 ERP / CRM / 进销存 / WMS / MES 等系统开发
- 旧 Access 系统升级、性能优化与架构重构
- AI 能力集成到现有 Access 业务系统
技术支持
- 代码审查与重构建议
- 疑难问题远程诊断
- 一对一技术辅导
联系方式:
- 公众号后台留言
- 邮箱:will.miao@edonsoft.com
- 微信:edonsoft
- 公司网站:www.edonsoft.com
总结
整个方案就是七步:
- 新建标准模块
Module_NumberInput - 写
IncrementValue和DecrementValue函数处理增减逻辑 - 写
ApplyNumberInputStyle函数设置样式 - 写
FormatNumberDisplay函数格式化显示 - 在窗体里添加文本框和两个按钮
- 在
Form_Load里应用样式,在按钮点击事件里调用增减函数 - 根据实际场景调整步进值、范围和格式
代码不到 100 行,支持整数、小数、千分位、百分比,最小值最大值自动限制。适合电商订单、库存管理、财务报表这些需要大量数字输入的场景,能减少用户输入错误。
使用场景
这个组件适合这些地方:
- 电商订单 - 商品数量选择
- 库存管理 - 入库出库数量
- 财务报表 - 金额、折扣输入
- 参数设置 - 数值型配置项
特别是给不太会用电脑的用户用,按钮点着改比手动输入出错率低。
几个细节
为什么不用 Spin Button 控件
Access 自带的 Spin Button 控件其实能实现类似功能,但有几个问题:
- 样式老旧,和现在的界面风格不太搭
- 控件本身只能输出整数值
- 需要单独绑定文本框,增加窗体控件数量
用这套方案,样式可以自己控制,代码逻辑也更清楚。
最小值和最大值处理
代码里用 IsEmpty 检查最小值和最大值是否传入。如果你不需要限制范围,调用时不传这两个参数就行:
Module_NumberInput.IncrementValue Me.txtNumber, 1
如果只限制最大值:
Module_NumberInput.IncrementValue Me.txtNumber, 1, , 100
小数处理
小数步进值直接传浮点数就行,比如 0.5、0.01。但要注意浮点数精度问题,价格这种场景一般用 2 位小数就够了。
如果你的业务需要更高精度,可以把 Double 改成 Decimal 类型,不过代码会复杂一些。
空值处理
代码里用 Nz(txt.Value, 0) 把空值转成 0。如果你希望空值保持为空,可以改成:
If IsNull(txt.Value) Then Exit Sub
不过一般数字输入框都有默认值,空值情况不多。
完整文件
完整代码和演示窗体我放在项目里了:
Module_NumberInput.bas- 核心模块Form_Demo_NumberInput.bas- 演示窗体代码README.md- 使用文档demo-number-input.html- HTML 演示页
导入 Module_NumberInput.bas 到你的项目,然后在窗体里调用就行。
小结
这个方案核心就是「简单实用」:
- 代码不到 100 行,逻辑清楚
- 样式可以按自己需要改
- 支持整数、小数、千分位、百分比
- 最小值最大值自动限制
如果你做的系统需要大量数字输入,特别是给普通用户用,这个组件能减少不少输入错误。
浙公网安备 33010602011771号