是否有任何工具跟踪Excel单元格和VBA代码的依赖关系?
Excel具有跟踪单元格的是否有任何工具跟踪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
先例
和从属项
的功能(通过菜单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