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

是否有任何工具跟踪Excel单元格和VBA代码的依赖关系?,vba,excel,dependencies,Vba,Excel,Dependencies,Excel具有跟踪单元格的先例和从属项的功能(通过菜单Tools>Auditing)。例如,如果我们在C4中有=C3+1,那么Excel可以跟踪C4是C3的依赖项(C3是C4的先例) 由于VBA代码对Excel单元格也有影响,我想知道是否有任何工具可以跟踪VBA代码和Excel单元格之间的依赖关系 例如,如果有一行VBA代码Range(“C4”)。Value=Range(“C3”)。Value+1,是否有工具跟踪C4可能与C3相关 另外,如果有一行VBA代码Range(“C4”)。Value=5

Excel具有跟踪单元格的
先例
从属项
的功能(通过菜单
Tools>Auditing
)。例如,如果我们在
C4
中有
=C3+1
,那么Excel可以跟踪
C4
C3
的依赖项(
C3
C4
的先例)

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

例如,如果有一行VBA代码
Range(“C4”)。Value=Range(“C3”)。Value+1
,是否有工具跟踪
C4
可能与
C3
相关


另外,如果有一行VBA代码
Range(“C4”)。Value=5
,是否有工具跟踪
C4
可能会被这段代码修改

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

你可以做一些事情,但这有点棘手,我想这不会真正让你满意:你可以检测一个细胞是否有依赖性

它是如何工作的?编写如下宏:

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
End Sub
您可以将更改的单元格记录到即时窗口。现在更改单元格值,在即时窗口中,您将看到依赖于所更改单元格的所有单元格。缺点

  • 不幸的是,逆过程是不可能的:您无法选择一个单元格并查看其所有依赖项
  • 该过程无法(真正地)自动化,因为从代码中通常您不知道单元格的有效值(您可能会根据单元格类型猜测,但由于规则的原因,您无法确定,“0”可能是有效值,“1”可能不是
  • 它不能真正检测每个依赖项(如果两个给定的值不能在单元格中产生更改,那么您就看不到该依赖项)
  • 对于大型工作表,它可能非常乏味,因此只有在应用于一小部分单元格时才会显示它(如果我更改/移动此单元格,会怎么样?它会影响任何事情吗?)

我不知道以下内容是否回答了您的问题,但我认为这很有帮助

范围
对象具有一个
先例
依赖项
属性。这允许您在VBA中执行UI中菜单
Tools->auditing
的操作。(我必须感谢@Bathsheba对最近这个问题的回答,因为他教了我这个…)

注意-您确实需要
集合
;否则,您将得到前面引用的值,而不是对对象的引用(在这种情况下,您无法看到地址…)

您可以对
执行相同的操作。显然,依赖项

这并没有回答“如果有一行VBA代码创建了一个关系”的问题……这是一个特别棘手的问题,因为您可以通过可变和不可预测的偏移量修改单元格,例如

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

哪个单元格取决于什么内容取决于您运行此脚本的日期…

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

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

关于这一点,最近在会议上进行了长时间的讨论。我认为最有用的解决方案——但不是你想要的——是免费提供的软件包“ACBA Tools.xla”——这与问题完全无关。
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