如何检查Excel窗口是否具有来自vba的焦点

时间:2012-07-13 19:44:04

标签: excel excel-vba excel-2007 vba

我有一些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

2 个答案:

答案 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 objXLEnd With之间限定所有代码(即cells(1,1)将成为.cells(1,1)ThisWorkbook将成为{{1} }})。如果你已经编写了很多代码,那会很痛苦,但是这应该强制Excel只查看你运行脚本的实例,以防止失去焦点。