3

我有一些可能需要几分钟到一个小时才能运行的 excel vba 宏。在运行结束时,他们会进行一堆排序。问题是,如果 Excel 没有焦点(iow,我正在另一个窗口中做某事),它就有问题,我必须关闭 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
4

2 回答 2

2

您收到该错误是因为您没有正确指定您的范围。

Range("A7:A" & i)例如,在前面添加工作表名称

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

哪里ws是需要进行排序的相关工作表。这样你就不需要激活窗口:)

编辑

如果您打开了多个 Excel 窗口,并且如果您想对包含代码的 Excel 文件中的工作表进行排序,那么请记住也要完全限定工作表对象。例如

Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets("Sheet1")
于 2012-07-13T20:16:33.933 回答
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 Withcells(1,1)即将成为.cells(1,1)ThisWorkbook将成为.ThisWorkbook)。如果您已经编写了很多代码,那会有点痛苦,但这应该会迫使 Excel 只查看您正在运行脚本的实例,从而防止失去焦点。

于 2012-07-15T17:15:09.587 回答