Excel 2013 VBA脚本在2019报错Runtime error 91的解决咨询
Excel 2019 VBA Runtime Error 91 问题解析与解决方案
错误原因
Excel 2019及后续版本导入CSV文件时,默认会将数据转换为结构化表格(ListObject),而Excel 2013默认是导入为普通单元格区域。
结构化表格的筛选功能属于表格对象自身属性,而非工作表的AutoFilter对象。此时直接调用Worksheets("Tabelle1").AutoFilter会返回Nothing,导致执行AutoFilter.Sort.SortFields.Clear时触发「Object variable or With-Block variable not set」(错误91)。而Excel 2013中数据是普通区域,手动开启AutoFilter后,AutoFilter对象正常初始化,因此代码可正常运行。
不依赖CSV文件名的解决方案
以下两种方案兼容Excel 2013和2019,均无需依赖动态变化的表格名称:
方案1:将结构化表格转为普通区域后沿用原有逻辑
先检查工作表是否存在结构化表格,若存在则转换为普通单元格区域,再执行原有的筛选排序逻辑:
Sub SortData() Dim ws As Worksheet Dim tbl As ListObject Set ws = ActiveWorkbook.Worksheets("Tabelle1") ' 检测并转换结构化表格为普通区域 On Error Resume Next Set tbl = ws.ListObjects(1) On Error GoTo 0 If Not tbl Is Nothing Then tbl.Unlist ' 取消表格格式,转为普通区域 End If ' 确保筛选功能已开启 If Not ws.AutoFilterMode Then ws.Range("A1").AutoFilter End If ' 执行排序操作 With ws.AutoFilter.Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("A2:A10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("D2:D10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("E2:E10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
方案2:兼容普通区域与结构化表格,通过索引操作表格
直接检测工作表中的结构化表格(通过索引ListObjects(1)获取,无需依赖名称),针对不同数据类型执行对应排序逻辑:
Sub SortTableData() Dim ws As Worksheet Dim tbl As ListObject Set ws = ActiveWorkbook.Worksheets("Tabelle1") ' 获取工作表中唯一的结构化表格 On Error Resume Next Set tbl = ws.ListObjects(1) On Error GoTo 0 If tbl Is Nothing Then ' 无表格时,按普通区域处理 If Not ws.AutoFilterMode Then ws.Range("A1").AutoFilter End If With ws.AutoFilter.Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("A2:A10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("D2:D10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("E2:E10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Else ' 有表格时,直接操作结构化表格的排序 With tbl.Sort .SortFields.Clear .SortFields.Add Key:=tbl.ListColumns(1).Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=tbl.ListColumns(4).Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=tbl.ListColumns(5).Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End If End Sub
说明
方案2更推荐,因为结构化表格自带数据区域自动扩展、格式统一等优势,通过索引ListObjects(1)获取表格可完全规避CSV文件名变化导致的表格名称动态变更问题。
内容的提问来源于stack exchange,提问作者phunsoft
相关产品推荐
相关产品推荐

