该代码在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
答案 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
块开始,并确保所有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 工具窗口 F4 )到,例如TopIssueSheet
,并使用该标识符而不是从Worksheets
集合中提取。
请注意,ActiveWorkbook
(当前活动的书)可能是ThisWorkbook
(包含此代码的书),也可能不是,如果活动的书错误并且没有{ {1}}工作表,这就是为什么您会遇到运行时错误9的原因。
为工作表使用代号,您不再需要关心哪个工作簿可能处于活动状态:
Top_Issue
在处理不是With TopIssueSheet
...
End With
的工作簿时,只需要从工作簿的Worksheets
集合中提取工作表即可。
答案 1 :(得分:1)
尝试使用表格代码而不是工作表名称。 Sheet1
等...
另外,请注意,Sheets集合和Worksheets集合是两件事。