excel - VBA 2016兼容性问题

标签 excel vba

该代码在 Excel 2013 和 Excel 2010 中运行良好 - 但在 Excel 2016 中显示错误:

Run time error 9 - subscript out of range

你能帮忙吗?该代码只是对一列进行排序并将其隐藏。

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

最佳答案

您在此处隐式引用了 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 block 开始,并确保所有 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 toolwindow F4) 到,例如TopIssueSheet,并使用该标识符,而不是从 Worksheets 集合中提取。

请注意,ActiveWorkbook(当前事件的书籍)可能是也可能不是 ThisWorkbook(包含此代码的书籍) - 如果错误的书籍处于事件状态,并且它没有 Top_Issue 表,这就是您收到运行时错误 9 的原因。

使用工作表的代码名称,您不再需要关心哪个工作簿可能处于事件状态:

With TopIssueSheet
    ...
End With

当您处理的工作簿不是 ThisWorkbook 时,您应该只需要从工作簿的 Worksheets 集合中提取工作表。

关于excel - VBA 2016兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51559558/

相关文章:

vba - 使用 MsgBox 从不同文档上的宏调用函数

vba - 设置 Listindex 后 Excel 列表框不一致地没有值

excel - 如何将 case 语句的返回值分配给 For 循环中当前单元格右侧的单元格?

excel - 如何忽略 MS Excel 中过滤器建议的最后一行?

javascript - 在 Microsoft Surface (Excel-VBA) 上运行时 GetJSObject 失败

excel - VBA循环工作表: Delete rows if cell doesn't contain

vba - 如何将从 wcf 服务接收的字节数组转换为 excel vba 中的文本文件

vba - MS Access,DoEvents 退出循环

excel - 替换字符串时如果没有找到错误(选择替换,查找替换)

Excel 2010 VBA - 获取当前单元格的左侧单元格?