Excel VBA将窗体文本框值写入工作表下一空单元格的代码排查
原有代码的核心问题
- With代码块完全失效,工作表引用错位
你写的With ThisWorkbook.Sheets("Folha1")没有起到绑定作用:块内的Range(...)、Rows.Count没有加句点前缀,实际是全局引用,会操作当前激活的工作表而非指定的"Folha1",这是数值写错位置、莫名新增列的核心诱因。 - 空行定位逻辑完全割裂
你把空行查找逻辑拆成了两个独立执行的语句,两次End(xlUp)查找没有共享行号结果:
第一条赋值语句是找A列最后非空行的下一行写入产品名
第二条赋值语句是找B列最后非空行、再往右偏移1列写入数量
两个语句没有绑定到同一个空行位置,完全不满足“同一行填两列”的预期。 - 重复覆盖、无法自动顺延的逻辑漏洞
你定义了LastRow变量但从未给它赋值、也没拿它做行号定位。每次运行代码时两次查找都是独立计算:如果B列长期为空,Range("B" & Rows.Count).End(xlUp)会直接定位到B1单元格,偏移1列就会写到C列,也就是你看到的“额外生成新列”;如果B列已经有历史数据,就会反复定位到B列的固定最后一行位置写值,自然就会覆盖已有内容、不会顺着A列的空行往下走。
修正后的可运行代码
Private Sub Print_Values_Click() ' 非空校验 If Select_prod.Value = "" Or Select_quant.Value = "" Then If MsgBox("Form is not complete. Do you want to continue?", vbQuestion + vbYesNo) <> vbYes Then Exit Sub End If End If Dim ws As Worksheet Dim LastRow As Long ' 固定绑定目标工作表,不随激活表变化 Set ws = ThisWorkbook.Sheets("Folha1") ' 基于A列查找最后非空行,统一计算出下一个空行的行号 LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1 ' 在同一空行的A、B列分别写入两个文本框的值 ws.Cells(LastRow, "A").Value = Select_prod.Value ws.Cells(LastRow, "B").Value = Select_quant.Value End Sub
落地注意事项
- 所有工作表内的单元格、行、列引用,都必须绑定明确的工作表对象,不能使用无归属的
Range、Rows这类全局写法,避免操作到错误的工作表 - 录入数据前仅需对核心基准列(如A列产品名列)做一次空行查找,拿到统一的行号后再在同一行填充多列内容,不要每填一列就重新执行一次空行查找,否则逻辑一定会混乱
- 修正原提示语的拼写错误:将
"Do you wan to continue?"调整为"Do you want to continue?",避免弹窗提示出现文字错误
内容的提问来源于stack exchange,提问作者Rwolf27
相关产品推荐
相关产品推荐

