Excel VBA用户表单IF语句问题:匹配工号后累加数量至指定列
问题:Excel VBA写入表单数据后无法正确累加对应工号的数量
我的代码大部分运行正常,但在将用户表单验证数据写入Excel时出现问题。我使用的表单允许用户在AA列输入工号、AC列输入数量,A列维护工号列表。点击按钮会自动填充AA至AD列,我需要在填充完成后检查该工号是否存在于A列,若存在则在对应行的D列累加刚输入的数量。后台有自动计算D列增量的代码,当前问题出在
If AddJobNoTxtBox.Value=Cells...语句处,以下是完整代码:
Private Sub CommandButton1_Click() whichSheet = PartNoTxtBox.Value If whichSheet = "" Then MsgBox "You didn't specify a Part Number" Exit Sub End If Worksheets(whichSheet).Activate If Me.PartNoTxtBox = "" Then GoTo MoreInfo If Me.AddJobNoTxtBox = "" Then GoTo MoreInfo If Me.AddShipperNoTxtBox = "" Then GoTo MoreInfo If Me.AddQtyTxtBox = "" Then GoTo MoreInfo If Me.AddDate = "" Then GoTo MoreInfo ''LastRow eRow = Cells(Rows.Count, "AA").End(xlUp).Offset(1, 27).Row Cells(eRow, 27) = AddJobNoTxtBox.Text Cells(eRow, 28) = AddShipperNoTxtBox.Text Cells(eRow, 29) = AddQtyTxtBox.Text Cells(eRow, 30) = AddDate.Text If AddJobNoTxtBox.Value = Cells(eRow, 1) Then Cells(eRow, 4) = AddQtyTxtBox.Text End If Unload UserForm1 Exit Sub MoreInfo: MsgBox "More information required." End Sub
问题根源分析
你的核心问题出在If AddJobNoTxtBox.Value = Cells(eRow, 1) Then这一行:
- 这里的
eRow是你计算的AA列新数据行号,用它去匹配A列的同位置单元格完全逻辑错误——你要找的是A列任意行中存在该工号的记录,而不是当前写入AA列那一行的A列单元格。 - 另外,你现在的代码是直接赋值
Cells(eRow, 4) = AddQtyTxtBox.Text,就算逻辑对了也只是覆盖原有值,没有实现累加操作。
解决步骤与优化代码
1. 正确查找A列的匹配工号
用Range.Find方法精准定位A列中是否存在目标工号,确保精确匹配:
Dim jobNoRange As Range Set jobNoRange = Worksheets(whichSheet).Range("A:A").Find(What:=AddJobNoTxtBox.Value, LookIn:=xlValues, LookAt:=xlWhole)
2. 实现累加逻辑
如果找到匹配行,就把D列现有值加上输入的数量;没找到的话可以弹出提示:
If Not jobNoRange Is Nothing Then ' 转换为数值类型避免文本拼接错误,执行累加 jobNoRange.Offset(0, 3).Value = jobNoRange.Offset(0, 3).Value + Val(AddQtyTxtBox.Text) Else MsgBox "该工号未在A列列表中找到,无法累加数量" End If
3. 修复行号计算错误
你原来的eRow计算逻辑有误,Offset(1,27)是向右偏移27列,导致行号完全不对。正确的AA列下一行行号应该是:
eRow = Worksheets(whichSheet).Cells(Rows.Count, "AA").End(xlUp).Row + 1
修改后的完整代码
Private Sub CommandButton1_Click() Dim whichSheet As String Dim eRow As Long Dim jobNoRange As Range whichSheet = PartNoTxtBox.Value If whichSheet = "" Then MsgBox "You didn't specify a Part Number" Exit Sub End If ' 避免使用Activate,直接引用工作表更稳定 With Worksheets(whichSheet) ' 合并必填项检查,代码更简洁 If Me.PartNoTxtBox = "" Or Me.AddJobNoTxtBox = "" Or _ Me.AddShipperNoTxtBox = "" Or Me.AddQtyTxtBox = "" Or Me.AddDate = "" Then GoTo MoreInfo End If ' 获取AA列下一行的正确行号 eRow = .Cells(.Rows.Count, "AA").End(xlUp).Row + 1 ' 写入表单数据到AA-AD列,数量转为数值类型 .Cells(eRow, 27).Value = Me.AddJobNoTxtBox.Value .Cells(eRow, 28).Value = Me.AddShipperNoTxtBox.Value .Cells(eRow, 29).Value = Val(Me.AddQtyTxtBox.Value) .Cells(eRow, 30).Value = Me.AddDate.Value ' 在A列查找目标工号 Set jobNoRange = .Range("A:A").Find(What:=Me.AddJobNoTxtBox.Value, LookIn:=xlValues, LookAt:=xlWhole) ' 执行累加操作 If Not jobNoRange Is Nothing Then jobNoRange.Offset(0, 3).Value = jobNoRange.Offset(0, 3).Value + Val(Me.AddQtyTxtBox.Value) Else MsgBox "该工号未在A列的列表中找到,无法累加数量" End If End With Unload UserForm1 Exit Sub MoreInfo: MsgBox "More information required." End Sub
额外优化建议
- 尽量避免使用
Activate,直接用With语句引用工作表,代码稳定性更高。 - 始终将输入的数量转为数值类型(
Val()),防止文本格式导致的计算错误。 - 如果不需要区分工号大小写,可以给
Find方法加上MatchCase:=False参数,增强兼容性。
内容的提问来源于stack exchange,提问作者Brandy
相关产品推荐
相关产品推荐

