Office 365 VBA:Worksheet Change触发获取表格最后空行报错求助
问题描述
- 接触VBA仅2周,使用Office 365,论坛新用户
- 需求:当
Table1的T-0 Date列日期被修改时,在T0Change表格的最后空行填入以下内容:- 新修改的T-0 Date值
- 修改发生的日期
- 从
Table1对应行获取经度值
- 当前卡点:无法正确识别
T0Change表格的最后空行(注:该表格未从A1单元格开始),现有代码如下:
工作表代码
Private Sub Worksheet_Change(ByVal Target As Range) ' identify change in CELL VALUE If Target.Columns.Count = Me.Columns.Count Then Exit Sub Dim watchrange As Range Set watchrange = Me.ListObjects("Table1").ListColumns("T-0 Date").DataBodyRange If Not Intersect(Target, watchrange) Is Nothing And Not IsEmpty(Target.Value) Then Call getfirstemptyrow End If End Sub
模块代码
Function GetFirstEmptyRow(tableName As String) As Long Dim lo As ListObject Set lo = Worksheets("Sheet3").ListObjects("T0Change") ' If the table is brand new and empty If lo.DataBodyRange Is Nothing Then GetFirstEmptyRow = lo.HeaderRowRange.Row + 1 Exit Function End If ' Use Find to get the last truly non-blank row in the table range Dim lastCell As Range Set lastCell = lo.Range.Find(What:="*", _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ LookIn:=xlValues) If Not lastCell Is Nothing Then GetFirstEmptyRow = lastCell.Row + 1 End If End Function
解决方案
1. 核心问题修复
原GetFirstEmptyRow函数存在两个缺陷:一是参数tableName未实际调用,二是手动计算行号容易出错(尤其是表格非A1起始时)。直接利用Excel表格对象的ListRows.Add方法是最可靠的方式,Excel会自动处理新行的位置,无需手动计算。
2. 完整功能实现代码
替换原工作表事件代码
Private Sub Worksheet_Change(ByVal Target As Range) ' 排除整表/整列更新的触发 If Target.Columns.Count = Me.Columns.Count Then Exit Sub Dim tbl1 As ListObject Dim watchRange As Range Set tbl1 = Me.ListObjects("Table1") Set watchRange = tbl1.ListColumns("T-0 Date").DataBodyRange ' 验证是否修改了目标列且单元格非空 If Not Intersect(Target, watchRange) Is Nothing And Not IsEmpty(Target.Value) Then ' 获取当前修改行的经度值(请替换为你的实际列名) Dim longitudeVal As Variant longitudeVal = tbl1.ListRows(Target.Row - tbl1.HeaderRowRange.Row).ListColumns("经度").Value ' 调用写入过程 WriteToT0Change Target.Value, Date, longitudeVal End If End Sub
替换原模块代码为以下过程
Sub WriteToT0Change(newT0Date As Date, changeDate As Date, longitude As Variant) Dim tblChange As ListObject Set tblChange = Worksheets("Sheet3").ListObjects("T0Change") ' 自动添加新行 Dim newRow As ListRow Set newRow = tblChange.ListRows.Add(AlwaysInsert:=True) ' 给新行赋值(请根据T0Change的实际列名调整) newRow.ListColumns("新T-0日期").Value = newT0Date newRow.ListColumns("修改日期").Value = changeDate newRow.ListColumns("经度").Value = longitude End Sub
关键说明
- 无需手动计算空行行号:
ListRows.Add会自动在表格末尾插入新行,完全适配非A1起始的表格 - 行索引计算更可靠:通过
Target.Row - tbl1.HeaderRowRange.Row获取修改行在Table1中的相对索引,避免单元格地址硬编码 - 功能一步到位:直接将写入逻辑封装到过程中,替代原有的仅获取行号的函数,更贴合需求
内容的提问来源于stack exchange,提问作者CAExcel365
相关产品推荐
相关产品推荐

