Excel具有跟踪单元格precedents
和dependents
的功能(通过菜单Tools > Auditing
)。例如,如果= C3 + 1
中有C4
,则Excel可以跟踪C4
是C3
的依赖项(C3
是{{1}的先例}})。
由于VBA代码对Excel单元格也有影响,我想知道是否有任何工具可以跟踪VBA代码和Excel单元格之间的依赖关系。
例如,如果有一行VBA代码C4
,是否有工具可以追踪Range("C4").Value = Range("C3").Value + 1
可能是C4
的依赖?
此外,如果有一行VBA代码C3
,是否有一个工具来跟踪Range("C4").Value = 5
可能被这段代码修改过?
答案 0 :(得分:2)
无法轻松跟踪VBA所做的更改(因为单元格可能被函数以任意方式修改或作为字符串传递给函数)。
你可以做些什么,但它有点棘手,我想它真的不能让你满意:你可以检测出一个细胞是否有任何依赖。
它是如何工作的?写一个像这样的宏:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
End Sub
您可以在更改的单元格的当前窗口中登录。现在更改单元格值,在即时窗口中,您将看到所有依赖于您更改的单元格的单元格。缺点
答案 1 :(得分:0)
我不知道以下是否回答了您的问题 - 但我认为这有帮助。
Range
对象具有Precedents
和Dependents
属性。这允许您在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