我有一个Excel VBA脚本来重新格式化和排序我从CSV文件导入的数据。该脚本是用Excel 2013开发的,它过去工作得很好。我更新了Office 2013到2019,脚本失败,runteim错误91“Object variable or With-Block variable not set”。
失败的代码部分是:
Range("A1").Select
Selection.AutoFilter
ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort.SortFields.Add Key:= _
Range("A2:A10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort.SortFields.Add Key:= _
Range("D2:D10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort.SortFields.Add Key:= _
Range("E2:E10001"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
错误发生在ActiveWorkbook.Worksheets("Tabelle1").AutoFilter.Sort.SortFields.Clear
行
我试图通过录制宏来了解更多。记录的步骤为:
- 单击单元格A1
- Activar过滤器
- 打开排序对话框并添加两列作为排序键,关闭对话框
- 结束记录
这是Excel记录的内容
Sub Makro1()
'
' Makro1 Makro
'
'
Range("TimeData5[[#Headers],[Start]]").Select
Selection.AutoFilter
ActiveWorkbook.Worksheets("Tabelle1").ListObjects("TimeData5").Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets("Tabelle1").ListObjects("TimeData5").Sort.SortFields. _
Add2 Key:=Range("TimeData5[Start]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
ActiveWorkbook.Worksheets("Tabelle1").ListObjects("TimeData5").Sort.SortFields. _
Add2 Key:=Range("TimeData5[Dauer]"), SortOn:=xlSortOnValues, Order:= _
xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Tabelle1").ListObjects("TimeData5").Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
我的代码和记录的代码之间的主要区别是所有排序操作中的.ListObjects("TimeData5")
。
对象名称(TimeData5
)似乎是导入数据的CSV文件的文件名,由数字后缀修改。这样做的问题是:
- CSV文件的名称将更改。
1.后缀由Excel以某种已知的方式设置和递增。
为什么Excel 2019中需要ListObjects()
,而Excel 2013中不需要?是否有变通方法来编写VBS,使其不依赖于CSV文件名?
1条答案
按热度按时间t40tm48m1#
这里有两件事在起作用。
一个是在工作表中以某种方式创建了表(
.ListObjects
暗示了这一点),这可能与版本更改有关,但是,应该看到代码的其他部分来确定这一点。另一个是
.Autofilter
可能在2013年和2019年之间发生了变化(我没有安装所有版本的Excel),这导致Worksheet.Autofilter
不再工作。如果你不喜欢table:修复创建它们的代码的另一部分,然后在每个
.Autofilter
之前插入一个引用.UsedRange
,如下所示: