You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:12:58