Vba 加快Excel表外从属项搜索速度

Vba 加快Excel表外从属项搜索速度,vba,excel,Vba,Excel,我使用“ShowDependents”和“NavigateArrow”VBA方法合并了表外依赖项搜索。一切都很好,但速度慢得让人痛苦(对于很多家属来说)。 有没有其他的方法可以加速呢?我尝试过禁用屏幕更新功能,但这并没有加快多少速度。 这就是我的代码的基础:考虑以下函数,如果传递的单元格直接依赖于不同的工作表,则该函数应返回true: Function LeadsOut(c As Range) As Boolean Application.ScreenUpdating = False

我使用“ShowDependents”和“NavigateArrow”VBA方法合并了表外依赖项搜索。一切都很好,但速度慢得让人痛苦(对于很多家属来说)。 有没有其他的方法可以加速呢?我尝试过禁用屏幕更新功能,但这并没有加快多少速度。
这就是我的代码的基础:

考虑以下函数,如果传递的单元格直接依赖于不同的工作表,则该函数应返回true:

Function LeadsOut(c As Range) As Boolean
    Application.ScreenUpdating = False
    Dim i As Long, target As Range
    Dim ws As Worksheet

    Set ws = ActiveSheet
    c.ShowDependents

    On Error GoTo return_false
    i = 1
    Do While True
        Set target = c.NavigateArrow(False, i)
        If c.Parent.Name <> target.Parent.Name Then
            ws.Select
            ActiveSheet.ClearArrows
            Application.ScreenUpdating = True
            LeadsOut = True
            Exit Function
        End If
        i = i + 1
    Loop
return_false:
    LeadsOut = False
    ActiveSheet.ClearArrows
    Application.ScreenUpdating = True
End Function

Sub test()
    MsgBox LeadsOut(Selection)
End Sub
奇怪!!!!! 我完全被难住了,直到我用

Debug.Print target.Address(External:=True)
这导致输出看起来像:

[dependents.xlsm]Sheet1!$A$1
[dependents.xlsm]Sheet1!$A$1
[dependents.xlsm]Sheet1!$A$1
[dependents.xlsm]Sheet1!$A$1
NavigateArrow(False,i)
返回原始单元格,并在我超过受抚养人的数量后停留在那里!这似乎是无证的,而且非常烦人。您链接到的代码是由尚未发现此问题的人编写的。作为一个难题,您应该检查在导航箭头时是否没有返回到起点。以下内容似乎在所有情况下都能立即发挥作用,尽管我没有对其进行过太多测试:

Function LeadsOut(c As Range) As Boolean
    Application.ScreenUpdating = False
    Dim i As Long, target As Range
    Dim ws As Worksheet

    Set ws = ActiveSheet
    c.ShowDependents

    On Error GoTo return_false
    i = 1
    Do While True
        Set target = c.NavigateArrow(False, i)
        If target.Address(External:=True) = c.Address(External:=True) Then
            GoTo return_false
        End If
        If c.Parent.Name <> target.Parent.Name Then
            ws.Select
            ActiveSheet.ClearArrows
            Application.ScreenUpdating = True
            LeadsOut = True
            Exit Function
        End If
        i = i + 1
    Loop
return_false:
    LeadsOut = False
    ActiveSheet.ClearArrows
    Application.ScreenUpdating = True
End Function

在链接到的sub中添加一些这样的检查应该会产生巨大的差异。

考虑以下函数,如果通过该函数的单元格直接依赖于不同的工作表,则该函数应返回true:

Function LeadsOut(c As Range) As Boolean
    Application.ScreenUpdating = False
    Dim i As Long, target As Range
    Dim ws As Worksheet

    Set ws = ActiveSheet
    c.ShowDependents

    On Error GoTo return_false
    i = 1
    Do While True
        Set target = c.NavigateArrow(False, i)
        If c.Parent.Name <> target.Parent.Name Then
            ws.Select
            ActiveSheet.ClearArrows
            Application.ScreenUpdating = True
            LeadsOut = True
            Exit Function
        End If
        i = i + 1
    Loop
return_false:
    LeadsOut = False
    ActiveSheet.ClearArrows
    Application.ScreenUpdating = True
End Function

Sub test()
    MsgBox LeadsOut(Selection)
End Sub
奇怪!!!!! 我完全被难住了,直到我用

Debug.Print target.Address(External:=True)
这导致输出看起来像:

[dependents.xlsm]Sheet1!$A$1
[dependents.xlsm]Sheet1!$A$1
[dependents.xlsm]Sheet1!$A$1
[dependents.xlsm]Sheet1!$A$1
NavigateArrow(False,i)
返回原始单元格,并在我超过受抚养人的数量后停留在那里!这似乎是无证的,而且非常烦人。您链接到的代码是由尚未发现此问题的人编写的。作为一个难题,您应该检查在导航箭头时是否没有返回到起点。以下内容似乎在所有情况下都能立即发挥作用,尽管我没有对其进行过太多测试:

Function LeadsOut(c As Range) As Boolean
    Application.ScreenUpdating = False
    Dim i As Long, target As Range
    Dim ws As Worksheet

    Set ws = ActiveSheet
    c.ShowDependents

    On Error GoTo return_false
    i = 1
    Do While True
        Set target = c.NavigateArrow(False, i)
        If target.Address(External:=True) = c.Address(External:=True) Then
            GoTo return_false
        End If
        If c.Parent.Name <> target.Parent.Name Then
            ws.Select
            ActiveSheet.ClearArrows
            Application.ScreenUpdating = True
            LeadsOut = True
            Exit Function
        End If
        i = i + 1
    Loop
return_false:
    LeadsOut = False
    ActiveSheet.ClearArrows
    Application.ScreenUpdating = True
End Function

在链接到的sub中添加一些这样的检查应该会产生巨大的差异。

如果依赖项背后有逻辑,那么您可能不必找到所有依赖项,而只需找到少数,然后从中计算其余的。我认为这可以为您节省很多时间。在这里,您可以找到一些提高代码速度的好方法。您是否禁用了立即窗口的输出?这是瓶颈。要删除依赖项,请使用另一种数据结构,如
Collection
,甚至使用VBA数组。如果一个集合项中需要多个字段,请创建一个
类模块
。如果依赖项背后有逻辑,那么您可能不必找到所有字段,而只需找到少数字段,然后从中计算其余字段。我认为这可以为您节省很多时间。在这里,您可以找到一些提高代码速度的好方法。您是否禁用了立即窗口的输出?这是瓶颈。要删除依赖项,请使用另一种数据结构,如
Collection
,甚至使用VBA数组。如果一个集合项中需要多个字段,请创建一个
类模块