VBA代码覆盖行问题:如何将新数据写入下一个空行?
解决VBA代码覆盖数据问题的修改方案
原代码存在重复判断逻辑、错误的空行定位方式及语法结构问题,导致新增数据时覆盖上一行内容。以下是修正后的完整代码及关键修改说明:
修正后的代码
Private Sub CommandButton1_Click() '创建并设置Time Tracker和Master Data工作表的变量 Dim TTrk As Worksheet, MDat As Worksheet Set TTrk = Sheet1 Set MDat = Sheet2 '创建并设置Time Tracker工作表中各单元格的变量 Dim Name As Range, AddDate As Range, TotalHours As Range Dim Activity As Range, Client As Range, Category As Range Dim AddHours As Range, TimeSpent As Range, Additional As Range Set Name = TTrk.Range("C2") Set AddDate = TTrk.Range("C3") Set TotalHours = TTrk.Range("C5") Set Activity = TTrk.Range("B8:B15") Set Client = TTrk.Range("C8:C15") Set Category = TTrk.Range("D8:D15") Set AddHours = TTrk.Range("E8:E15") Set TimeSpent = TTrk.Range("F8:F15") Set Additional = TTrk.Range("G8:G15") '创建Master Data工作表中粘贴单元格的变量 Dim DestCell As Range Dim lastRow As Long '定位Master Data中A列最后一个非空行的下一行 lastRow = MDat.Cells(MDat.Rows.Count, "A").End(xlUp).Row '如果A2是空的(即表格还没有数据),则从A2开始,否则从最后一行的下一行开始 If lastRow = 1 Then Set DestCell = MDat.Range("A2") Else Set DestCell = MDat.Cells(lastRow + 1, "A") End If '将Time Tracker工作表的数据复制粘贴到Master Data工作表 Name.Copy DestCell AddDate.Copy DestCell.Offset(0, 1) TotalHours.Copy DestCell.Offset(0, 2) Activity.Copy DestCell.Offset(0, 3) Client.Copy DestCell.Offset(0, 4) Category.Copy DestCell.Offset(0, 5) AddHours.Copy DestCell.Offset(0, 6) TimeSpent.Copy DestCell.Offset(0, 7) Additional.Copy DestCell.Offset(0, 8) '清除Time Tracker工作表中的内容 AddDate.ClearContents TotalHours.ClearContents Activity.ClearContents Client.ClearContents Category.ClearContents AddHours.ClearContents TimeSpent.ClearContents Additional.ClearContents End Sub
关键修改说明
- 修复语法错误:删除原代码中重复的判断逻辑,补充缺失的
End If,解决执行逻辑混乱问题。 - 可靠的空行定位:改用
MDat.Cells(MDat.Rows.Count, "A").End(xlUp).Row获取A列最后一个非空行的行号,避免因A列中间有空行导致的定位错误,这是VBA中定位最后一行的标准写法。 - 简化目标单元格赋值:通过判断最后一行是否为1(即表头行,无数据行),直接定位到正确的起始行,规避原代码中
Offset参数错误导致的覆盖问题。
内容的提问来源于stack exchange,提问作者blueorchid00
相关产品推荐
相关产品推荐

