该代码在 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 开始,并确保所有 Range
和 Worksheet
成员调用均经过正确限定:
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/