VBA 2016兼容性问题

时间:2018-07-27 13:57:01

标签: excel vba

该代码在Excel 2013和Excel 2010中正常工作-但在Excel 2016中显示错误:

  

运行时错误9-下标超出范围

可以帮忙吗?该代码仅对列进行排序并隐藏。

Sub abc()
    Sheets("Top_Issue").Visible = True
    Sheets("Top_Issue").Select
    lastrow = Cells(Rows.Count, "a").End(xlUp).Row
    Range(Cells(1, "p"), Cells(lastrow, "p")).Select
    ActiveWorkbook.Worksheets("Top_Issue").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Top_Issue").Sort.SortFields.Add Key:=Range("P1"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Top_Issue").Sort
        .SetRange Range("A2:S" & lastrow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Sheets("Top_Issue").Visible = False
End Sub

2 个答案:

答案 0 :(得分:2)

您在此处有对ActiveSheet的隐式引用:

lastrow = Cells(Rows.Count, "a").End(xlUp).Row
Range(Cells(1, "p"), Cells(lastrow, "p")).Select

上述不合格的Range成员呼叫与此等效:

lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "a").End(xlUp).Row
ActiveSheet.Range(ActiveSheet.Cells(1, "p"), ActiveSheet.Cells(lastrow, "p")).Select

使用.Select / .Activate并隐式引用活动工作表的代码很可能最终会在假设被打破的情况下崩溃,例如ActiveWorkbook不是代码假定的工作簿。

您要为该Top_Issue工作表提取对象引用6次;有时来自ActiveWorkbook,有时使用Sheets集合,有时使用Worksheets集合,之间有.Select调用。

With块开始,并确保所有RangeWorksheet成员调用都具有适当的资格:

With ActiveWorkbook.Worksheets("Top_Issue")
    .Visible = True
    .Select
    lastrow = .Cells(.Rows.Count, "a").End(xlUp).Row
    .Range(.Cells(1, "p"), .Cells(lastrow, "p")).Select
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=.Range("P1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With .Sort
        .SetRange .Range("A2:S" & lastrow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    .Visible = False
End With

如果Top_Issue表在编译时存在于ThisWorkbook中,则设置其(Name)属性(在 Properties 工具窗口 F4 )到,例如TopIssueSheet,并使用该标识符而不是从Worksheets集合中提取。

请注意,ActiveWorkbook(当前活动的书)可能是ThisWorkbook(包含此代码的书),也可能不是,如果活动的书错误并且没有{ {1}}工作表,这就是为什么您会遇到运行时错误9的原因。

为工作表使用代号,您不再需要关心哪个工作簿可能处于活动状态:

Top_Issue

在处理不是With TopIssueSheet ... End With 的工作簿时,只需要从工作簿的Worksheets集合中提取工作表即可。

答案 1 :(得分:1)

尝试使用表格代码而不是工作表名称。 Sheet1等...

另外,请注意,Sheets集合和Worksheets集合是两件事。