如何列出excel公式中引用的所有单元格

如何列出excel公式中引用的所有单元格

浏览次数:987次
信息来源: 银河系资源网
更新日期: 2022-05-06
文章简介

Q:Excel没有提供便捷的方法来找到所给单元格的所有引用单元格,虽然Range对象有一个Precedents属性,但只适用于引用单元格都在同一工作表上的情况。例如,下所示的工作表Sheet1,在单元格A1中的公式为=B3+5,而单元...

Q:Excel没有提供便捷的方法来找到所给单元格的所有引用单元格,虽然Range对象有一个Precedents属性,但只适用于引用单元格都在同一工作表上的情况。

例如,下所示的工作表Sheet1,在单元格A1中的公式为=B3+5,而单元格B3中的公式又引用了单元格D2和E2,单元格D2甚至引用了另一工作表Sheet2中的单元格A1。

通过公式选项卡中的“追踪引用单元格”命令,可以看到单元格A1的引用关系如下所示。

下面的程序:

Sub test()

Dim rngToCheck As Range

Dim rngPrecedents As Range

Dim rngPrecedent As Range

Set rngToCheck = Range(“A1”)

On Error Resume Next

Set rngPrecedents = rngToCheck.Precedents

On Error GoTo

If rngPrecedents Is Nothing Then

Debug.PrintrngToCheck.Address(External:=True) & “没有引用单元格.”

Else

For Each rngPrecedent In rngPrecedents

Debug.PrintrngPrecedent.Address(External:=True)

Next rngPrecedent

End If

End Sub

得到的结果是:

[Q&A49.xlsm]Sheet1′!$B$3

[Q&A49.xlsm]Sheet1′!$D$2

[Q&A49.xlsm]Sheet1′!$E$2

并没有追踪列出第3级的引用关系,即对工作表Sheet2中单元格A1的引用。

由于大多数电子表格计算横跨多个工作表,因此Precedents属性不能满足要求,能不能编写一个程序用来列出含有公式的单元格引用的所有单元格?

A:可以编写VBA程序来解决Precedents属性的局限。这个程序会确定所提供的单元格区域的引用单元格并以正确的引用顺序列出它们,唯一的限制是无法重新计算已关闭工作簿、隐藏的工作表、受保护工作表或循环引用中的引用单元格。

使用下面的程序(本文在整理时略有修改)可以列出单元格A1的引用单元格和层级关系。

Sub testGetAllPrecedents()

Dim rngToCheck As Range

Dim dicAllPrecedents As Object

Dim i As Long

Dim str As String

Set rngToCheck =Sheet1.Range(“A1”)

Set dicAllPrecedents =GetAllPrecedents(rngToCheck)

str = “单元格” & ActiveCell.Address(False, False) & “中的公式为: ” _

& ActiveCell.Formula &vbCrLf

str = str & “其依次引用的单元格信息如下:” & vbCrLf & vbCrLf

str = str & “层级” & vbTab & “引用的单元格” & vbTab & vbTab & “公式” & vbCrLf

If dicAllPrecedents.Count = Then

MsgBox rngToCheck.Address(External:=True)& “没有引用单元格.”

Else

For i = LBound(dicAllPrecedents.Keys)To UBound(dicAllPrecedents.Keys)

str = str &dicAllPrecedents.Items()(i) & vbTab

str = str &dicAllPrecedents.Keys()(i) & vbTab

str = str & Range(dicAllPrecedents.Keys()(i)).Formula& vbCrLf

Next i

End If

MsgBox str

End Sub

Public Function GetAllPrecedents(ByRef rngToCheck As Range) As Object

Const lngTOP_LEVEL As Long = 1

Dim dicAllPrecedents As Object

Dim strKey As String

Set dicAllPrecedents =CreateObject(“Scripting.Dictionary”)

Application.ScreenUpdating = False

GetPrecedents rngToCheck, dicAllPrecedents,lngTOP_LEVEL

Set GetAllPrecedents = dicAllPrecedents

Application.ScreenUpdating = True

End Function

Private Sub GetPrecedents(ByRef rngToCheck As Range, ByRef dicAllPrecedents As Object,ByVal lngLevel As Long)

Dim rngCell As Range

Dim rngFormulas As Range

If Not rngToCheck.Worksheet.ProtectContentsThen

If rngToCheck.Cells.CountLarge > 1Then

On Error Resume Next

Set rngFormulas =rngToCheck.SpecialCells(xlCellTypeFormulas)

On Error GoTo

Else

If rngToCheck.HasFormula Then SetrngFormulas = rngToCheck

End If

If Not rngFormulas Is Nothing Then

For Each rngCell InrngFormulas.Cells

GetCellPrecedents rngCell,dicAllPrecedents, lngLevel

Next rngCell

rngFormulas.Worksheet.ClearArrows

End If

End If

End Sub

Private Sub GetCellPrecedents(ByRef rngCell As Range, ByRef dicAllPrecedents As Object,ByVal lngLevel As Long)

Dim lngArrow As Long

Dim lngLink As Long

Dim blnNewArrow As Boolean

Dim strPrecedentAddress As String

Dim rngPrecedentRange As Range

Do

lngArrow = lngArrow + 1

blnNewArrow = True

lngLink =

Do

lngLink = lngLink + 1

rngCell.ShowPrecedents

On Error Resume Next

Set rngPrecedentRange =rngCell.NavigateArrow(True, lngArrow, lngLink)

If Err.Number <> Then

Exit Do

End If

On Error GoTo

strPrecedentAddress =rngPrecedentRange.Address(False, False, xlA1, True)

If strPrecedentAddress =rngCell.Address(False, False, xlA1, True) Then

Exit Do

Else

blnNewArrow = False

If NotdicAllPrecedents.Exists(strPrecedentAddress) Then

dicAllPrecedents.Add strPrecedentAddress,lngLevel

GetPrecedentsrngPrecedentRange, dicAllPrecedents, lngLevel + 1

End If

End If

Loop

If blnNewArrow Then Exit Do

Loop

End Sub

GetAllPrecedents函数返回一个Dictionary对象,包含在键中的单元格地址和在项中的引用层级。代码使用了递归:GetPrecedents过程和GetCellPrecedents过程一遍一遍地相互调用,直到遍历完所有引用单元格。

对于上面的示例工作表,运行代码后的结果如下所示。

如何创建Excel加载宏
« 上一篇
excel VBA代码怎么在单元格中输入数组公式?
下一篇 »
  • 如何计算同一单元格中的Excel数据的公式和?
    750444阅读
    在某些表格中,我们需要将所有数据输入到一个单元格中来计算公式,而通用公式是在不同的单元格中计算的。我们应该如何计算这种情况?在这里,小王先生将与大家分享几种常用的方法。1.用户定义的名称首先,输入公式定...
  • 按日期记录的产品销量,SUMIFS帮你按月统计
    703277阅读
    今天,朋友传来EXCEL文件,内有两张工作表,一张是按照日期记录的商品销量,另一张是按月统计的模板,请帮忙统计每种产品的月销量。商品销量记录表:按月统计的模板:关键操作第一步:TEXT函数建立辅助列在日期列前插...
  • excel从字符串中提取数字——数字位于字符串开头
    280907阅读
    本文主要研究从字符串开头提取数字的技术:1. 这些数字是连续的2. 这些连续的数字位于字符串的开头3. 想要的结果是将这些连续的数字返回到单个单元格对于下面研究的每种解决方案,我们需要在两种不同的情况下测试其健...
  • excel按类别分页打印,有时需要强制
    129533阅读
    今天,就有位朋友提出一个很实用的问题:有时候需要按照类别打印,比如以下数据样表,需要按地区分页打印:怎么办?两种方法:一、筛选后打印这种方法,可能大家都会用到:先按照不同地区筛选,筛选一次打印一次。如...
  • Excel表格日期公式和快捷技巧教程
    100555阅读
    Excel表格日期公式和快捷技巧教程1.excel日期的快捷键方法。首先,让我们介绍快捷键的方法(不需要公式)。方法很简单,在细胞里,同时按两个快捷键:Ctrl你可以得到当前日期。注意:1)不需要输入号码。2)其中;在英文...
  • excel公式教程:找到和的加数
    79917阅读
    有时候,我们给出一个目标值,想要知道这个值是已经提供的一系列值中哪几个值的和。如下图1所示,在单元格A2中给出了目标值47,在单元格C1:K1中有9个值,现在我们想知道这些值中哪些值相加等于47,在这些值的下方单元...
  • Excel中F8键的妙用
    47128阅读
    键盘上的键有什么用呢?今天我们一起来看看键在excel表中能发挥什么作用呢?1、使用F8键的功能选取单元格区域:比如:我要选中区域B2:D7这还不简单啊,直接用鼠标选取就行啦,对,没错,但是除了使用鼠标直接选取外,...
  • Excel中Rank函数排名
    31517阅读
    EXCEL中有一个很神奇的函数“RANK”,他能够将数字的排名单独显示在另一列,而且可以去除重名次。所显示的结果是有多少人就显示多少名。下面小编就来与大家分享一下,希望对大家有点帮助。1.返回一列数字的数字排位。...
  • “Excel批处理”成批修改文件名 以帮助您组织文件!
    31167阅读
    操作方法步骤1:首先定义名称,引用位置是[=FILES(&#8216;D:\ my folder \ *。docx &#8216;)];自己设置驱动器号路径!查看您需要组织文件夹的位置,并设置它!然后,在单元格A1中输入[=INDEX(名称,行(A1))]的引...
  • Excel一学就会的饼图制作技巧
    20119阅读
    如何用饼图来展示任务完成百分比。先看效果:要实现这样的效果,其实很简单,接下来咱们就看看具体的操作过程:步骤1 准备数据源B1单元格中输入完成率,B2单元格中输入公式计算剩余量:=1-B1步骤2 插入饼图步骤3 设置...

如本文对您有帮助,随意赞赏一下!