我有一些excel vba宏可能需要几分钟到一个小时才能运行。在运行结束时,他们做了一堆排序。问题是,如果Excel没有焦点(喵,我在另一个窗口中做某事),它有一个问题,我必须关闭excel并重新打开它。我不确定问题是什么,但我知道它在尝试运行Sort.Apply时会发生。无论如何我可以检查excel是否有焦点,如果没有,要么给它焦点还是弹出一个复选框?
更新:以下是代码。我只是测试了它,它失败了。错误是“方法'应用'对象'排序'失败”,“运行时错误'-2147417848(80010108)':”
With rws.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("A7:A" & i _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Range("C7:C" & i _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A6:K" & i)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
.SortFields.Clear
End With
i
是一个具有排序范围底部的变量,可以从工作表中的数字或排序之前获得。
我不认为我每次都会得到它,但除了保持专注之外,我不确定如何防止它。我现在这样做的方式是有一个消息框警告我它正在排序,但是我试图让它完全自动化,所以我将需要做其他事情。
更新:这是我更新的代码。
With rws.Sort
.SortFields.Clear
.SortFields.Add Key:=rws.Range("A7:A" & i _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=rws.Range("C7:C" & i _
), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange rws.Range("A6:K" & i)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
.SortFields.Clear
End With
答案 0 :(得分:2)
您收到该错误是因为您没有正确指定范围。
在Range("A7:A" & i)
之前添加工作表名称,例如
ws.Range("A7:A" & i)
其中ws
是需要进行排序的相关表单。这样您就不需要激活窗口了:)
修改强>
如果您打开了多个Excel窗口,并且如果要在具有代码的Excel文件中对工作表进行排序,那么请记住完全限定工作表对象。例如
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet1")
答案 1 :(得分:0)
我自己已经遇到过这几次,我不记得我是如何处理它的。尝试将.SetRange rws.Range("A6:K" & i)
更改为.SetRange Range("A6:K" & i)
,并保留其余代码。我不确定您是否必须使用工作表对象再次限定Range。如果这不起作用,我将检查我明天在工作中编写的一些代码。
修改强> @RBarryYoung - 你是对的我在这方面做错了方向。我不认为上面的建议会奏效。
我唯一的另一个建议是在单独的实例中运行工作簿。例如:
Dim objXL as New Excel.Application
With objxl
.Workbooks.Open("C:\Someworkbook.xlsx")
.Visible = True ''or false
''Your Code Here
.ThisWorkbook.SaveAs("C:\Someworkbook.xlsx")
.Quit
End With
您必须在With objXL
和End With
之间限定所有代码(即cells(1,1)
将成为.cells(1,1)
,ThisWorkbook
将成为{{1} }})。如果你已经编写了很多代码,那会很痛苦,但是这应该强制Excel只查看你运行脚本的实例,以防止失去焦点。