5

Excel 具有跟踪单元格的precedentsdependents的功能(通过 menu Tools > Auditing)。例如,如果我们有= C3 + 1in C4,那么 Excel 可以跟踪它C4是依赖于C3(C3C4) 的先例。

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

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

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

4

3 回答 3

2

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

你可以做一些事情,但它有点棘手,我想它不会真正让你满意:你可以检测一个单元格是否有任何依赖关系。

这个怎么运作?写一个这样的宏:

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

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

  • 不幸的是,逆过程是不可能的:您无法选择一个单元格并查看其所有依赖项。
  • 该过程不能(真正)自动化,因为通常从代码中您不知道单元格的有效值(您可能会根据单元格类型猜测,但由于规则无法确定,“0”可能是有效值,“1”可能是有效值“例如,不)。
  • 它不能真正检测到每个依赖项(如果两个给定值不会在单元格中产生变化,那么您将看不到该依赖项)。
  • 对于大型工作表,它可能非常乏味,因此仅在应用于一小组单元格时才指示(如果我更改/移动此单元格怎么办?它会影响什么吗?)
于 2012-04-24T11:52:21.320 回答
0

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

Range对象具有PrecedentsandDependents属性。这允许您在 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

哪个单元格取决于您运行此脚本的日期...</p>

于 2013-12-17T15:01:56.547 回答
-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
于 2021-03-04T20:03:55.367 回答