是否有任何工具可以跟踪Excel单元格和VBA代码的依赖性?

时间:2012-04-24 11:42:17

标签: excel vba excel-vba dependencies

Excel具有跟踪单元格precedentsdependents的功能(通过菜单Tools > Auditing)。例如,如果= C3 + 1中有C4,则Excel可以跟踪C4C3的依赖项(C3是{{1}的先例}})。

由于VBA代码对Excel单元格也有影响,我想知道是否有任何工具可以跟踪VBA代码和Excel单元格之间的依赖关系。

例如,如果有一行VBA代码C4,是否有工具可以追踪Range("C4").Value = Range("C3").Value + 1可能是C4的依赖?

此外,如果有一行VBA代码C3,是否有一个工具来跟踪Range("C4").Value = 5可能被这段代码修改过?

3 个答案:

答案 0 :(得分:2)

无法轻松跟踪VBA所做的更改(因为单元格可能被函数以任意方式修改或作为字符串传递给函数)。

你可以做些什么,但它有点棘手,我想它真的不能让你满意:你可以检测出一个细胞是否有任何依赖。

它是如何工作的?写一个像这样的宏:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
End Sub

您可以在更改的单元格的当前窗口中登录。现在更改单元格值,在即时窗口中,您将看到所有依赖于您更改的单元格的单元格。缺点

  • 不幸的是,逆过程是不可能的:你不能选择一个单元格并查看它的所有依赖项。
  • 这个过程不能(真的)自动化,因为从代码中你通常不知道细胞的有效值(你可能会根据细胞类型来猜测,但你不能因为规则而确定," 0"可能是有效值," 1" no,例如)。
  • 它无法真正检测到每个依赖关系(如果两个给定的值不会在单元格中产生更改,那么您将无法看到该依赖关系)。
  • 对于大型工作表,它可能非常繁琐,只有在应用于一小组单元格时才会显示(如果我更改/移动此单元格会怎么样?它会影响到什么吗?)

答案 1 :(得分:0)

我不知道以下是否回答了您的问题 - 但我认为这有帮助。

Range对象具有PrecedentsDependents属性。这允许您在VBA中执行菜单Tools->auditing在UI中执行的操作。 (我必须承认@ Bathsheba对最近这个问题的答案https://stackoverflow.com/a/20635795/1967396教我这个......)。

Dim prec, p
Set prec = [C4].Precedents  ' [C4] is shorthand for Range("C4")
For Each p in prec
  Debug.Print "Precedent found: " & p.Address
next p

注意 - 您确实需要Set;否则你最终会得到先例的,而不是对对象的引用(在这种情况下你看不到地址......)

您可以使用.Dependents执行相同的操作,显然:

这不会回答"如果有一行VBA代码创建关系"问题...这是特别棘手的,因为你可以通过可变和不可预测的偏移修改单元格,例如

For j = 1 To n
  [B5].Offset(j+3, 2+k) = [A2].Offset(Int(DateValue(Now)) Mod 3, 1)
Next j

哪个单元格取决于运行此脚本的日期...

答案 2 :(得分:-1)

也许这对你有用。我编写了一个宏,以便您可以选择一个范围并显示该范围内每个单元格的优先级或相关性。

Sub tracerange()

On Error Resume Next

    Dim R As Range
    Dim DorP As Variant
    R = ActiveWindow.RangeSelection.Address
    DorP = LCase(Application.InputBox("Please input Precedents or Dependece (P or D):", , , , , , , Type:=2))
        For Each R In Selection
            If DorP = "p" Then
                R.ShowPrecedents
            Else
                R.ShowDependents
            End If
            DoEvents
        Next

End Sub