Excel VBA编译错误:Expected Sub, Function, or Property问题求助
修复VBA编译错误及代码优化
错误原因及修复点
- 语法缺失与错误:
- 未用
End If闭合If语句,触发编译报错。 last_row 1是无效语法,正确写法为last_row = last_row + 1。
- 未用
- 变量声明错误:
Dim ws As Worksheets应改为Dim ws As Worksheet(单个工作表对象需用单数类型)。
- 对象引用错误:
- 工作表名
Letters和表格名Tracker作为字符串需加双引号,否则会被识别为未定义变量:Sheets("Letters")、ws.ListObjects("Tracker")(推荐用ListObjects而非Tables,是Excel对象模型的标准写法)。
- 工作表名
- ListObject范围引用错误:
- 获取表格C列最后一行的写法错误,应通过
ListColumns定位列后再获取最后非空行。 - 赋值时需用
DataBodyRange访问表格的数据区域,避免包含表头。
- 获取表格C列最后一行的写法错误,应通过
修复后的完整代码
Sub data_input() Dim ws As Worksheet Dim table As ListObject Dim last_row As Long Dim colC As Range ' 设置工作表和表格对象 Set ws = Sheets("Letters") Set table = ws.ListObjects("Tracker") ' 获取表格C列的数据区域 Set colC = table.ListColumns(3).DataBodyRange ' 确定最后一行非空行号(相对于表格数据区域) If Not colC Is Nothing Then last_row = colC.Cells(colC.Rows.Count).End(xlUp).Row ' 如果最后一行是空行,行号+1 If Application.CountA(colC.Cells(last_row)) = 0 Then last_row = last_row + 1 End If Else ' 表格为空时,第一行就是数据起始行 last_row = 1 End If ' 赋值到表格对应单元格 With table.DataBodyRange .Cells(last_row, 3).Value = Range("entity").Value .Cells(last_row, 4).Value = Range("letter_type").Value .Cells(last_row, 6).Value = Range("bu").Value .Cells(last_row, 8).Value = Range("date").Value .Cells(last_row, 9).Value = Range("project_name").Value .Cells(last_row, 10).Value = Range("enduser_name").Value .Cells(last_row, 11).Value = Range("partner_name").Value .Cells(last_row, 12).Value = Range("requestor_name").Value .Cells(last_row, 13).Value = Range("details").Value End With End Sub
额外说明
针对你提到的“保存后last_row + 1变回错误写法”,可尝试以下解决方法:
- 编辑完成后先检查语法(点击VBA编辑器工具栏的“运行”按钮提前排查错误),确认无误后再保存。
- 关闭并重新打开Excel及VBA编辑器,清除编辑器缓存。
- 若工作簿受保护,需先解除保护再进行编辑保存。
内容的提问来源于stack exchange,提问作者3llyas
相关产品推荐
相关产品推荐

