脚本曾经在Excel 2013中工作,但现在在Excel 2019中失败,并出现“运行时错误91:对象变量…未设置”

mv1qrgav  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(205)

我有一个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文件的文件名,由数字后缀修改。这样做的问题是:

  1. CSV文件的名称将更改。
    1.后缀由Excel以某种已知的方式设置和递增。
    为什么Excel 2019中需要ListObjects(),而Excel 2013中不需要?是否有变通方法来编写VBS,使其不依赖于CSV文件名?
t40tm48m

t40tm48m1#

这里有两件事在起作用。
一个是在工作表中以某种方式创建了表(.ListObjects暗示了这一点),这可能与版本更改有关,但是,应该看到代码的其他部分来确定这一点。
另一个是.Autofilter可能在2013年和2019年之间发生了变化(我没有安装所有版本的Excel),这导致Worksheet.Autofilter不再工作。
如果你不喜欢table:修复创建它们的代码的另一部分,然后在每个.Autofilter之前插入一个引用.UsedRange,如下所示:

ActiveWorkbook.Worksheets("Tabelle1").UsedRange.AutoFilter.Sort.SortFields.Clear

相关问题