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

我有一些Excel VBAmacros,可能需要几分钟到一个小时才能运行。 在运行结束时,他们做了一堆sorting。 问题是,如果Excel没有焦点(喵,我正在做另一个窗口中的东西),它有一个问题,我必须closuresExcel并重新打开它。 我不知道是什么问题,但我知道它发生时,它会尝试运行Sort.Apply。 有无论如何,我可以检查是否有Excel的焦点,如果没有,要么给它的焦点或popup一个checkbox?

更新:这是代码。 我只是testing它,并失败。 错误是“方法'应用'对象'sorting'失败','运行时错误'-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是一个variables,具有sorting范围的底部,这是从表中的数字或sorting之前得到的。

我不认为我每一次都得到它,但我不知道如何防止它,而不是停留在焦点。 我现在做的方式是有一个消息框提醒我,它正在sorting,但是我试图使这个完全自动化,所以我将需要做别的事情。

更新:这是我更新的代码。

  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 

你得到这个错误,因为你没有正确指定你的范围。

例如,在Range("A7:A" & i)之前添加表单名称

 ws.Range("A7:A" & i) 

其中ws是需要进行分类的相关工作表。 这样你就不需要激活窗口:)

编辑

如果您打开了多个Excel窗口,并且想要在具有该代码的Excel文件中对工作表进行sorting,请记住完全限定工作表对象。 例如

 Dim ws As Worksheet Set ws = ThisWorkbook.Sheets("Sheet1") 

我已经碰到过好几次了,我不记得我是怎么处理它的。 尝试更改.SetRange rws.Range("A6:K" & i).SetRange Range("A6:K" & i)并保留其余的代码。 我不确定你必须再次使用工作表对象来限定范围。 如果这不起作用,我会检查一下我在明天写的代码。

编辑: @RBarryYoung – 你是对的我在这个错误的方向去。 我不认为上面的build议会起作用。

我唯一的其他build议是在单独的实例中运行工作簿。 例如:

 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将成为.ThisWorkbook )。 如果你已经写了很多代码,但是这样做会迫使Excel只查看你正在运行脚本的实例,防止失去焦点。