Menu

Excel 循环引用:如何查找和解决

循环引用是指公式直接或通过其他公式引用了自己所在的单元格,例如在 B7 中输入 =SUM(B2:B7)。Excel 会弹出警告、显示 0,并在“公式 > 错误检查 > 循环引用”下列出该单元格。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

循环引用是指公式直接或通过其他公式引用了自己所在的单元格。在 B7 中输入 =SUM(B2:B7) 就会产生一个:合计把自己也算了进去。Excel 会显示警告,在单元格中填入 0,并在 公式 > 错误检查 > 循环引用 下列出它。解决办法是修改区域,让它在公式所在单元格之前结束,这里就是 =SUM(B2:B6)。

B7:  =SUM(B2:B7)    circular: B7 is inside its own range, Excel shows 0
B7:  =SUM(B2:B6)    fixed: the range stops above the total
合计区域停在自身上方
B7
AB
1MonthSales
2Jan120
3Feb95
4Mar140
5Apr110
6May130
7Total595
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

点击 B7:彩色框覆盖 B2:B6,停在合计的上方。这是最常见的循环引用。它通常出现在合计正上方插入了一行,而手动扩展 SUM 区域时多拉了一行;或者用鼠标拖选区域时拖过了合计单元格。

Excel 如何处理循环引用

输入公式时,Excel 会弹出一条消息:“存在一个或多个循环引用,其中公式直接或间接引用其自己的单元格。这可能导致计算不正确。”点击 确定 后,公式会保留下来,显示 0(或它上一次的值)。之后:

  • 只要该工作表处于活动状态,窗口底部的状态栏就会显示 循环引用: B7(循环中某个单元格的地址)。
  • 你继续操作时,Excel 不会再次弹出这条消息,所以循环引用可能一直藏在工作簿里没人发现,只有状态栏在提醒你。
  • 依赖这个单元格的其他公式会使用这个 0,于是后面的合计都错了,却没有任何报错。

同一个工作簿在 Google Sheets 中会显示 #REF!,并附带“检测到循环依赖关系”的说明。

如何在 Excel 中查找循环引用

  1. 看状态栏。它会给出当前工作表中的一个单元格。如果只显示 循环引用 而没有地址,说明循环在另一个工作表中。
  2. 打开 公式 > 错误检查,点击它旁边的小箭头,指向 循环引用。子菜单会列出处于循环中的单元格。点击其中一个即可选中它。
  3. 选中该单元格后,使用 公式 > 追踪引用单元格,从它读取的单元格画出箭头。顺着箭头找,直到某个箭头绕回起点。删除箭头 可以清除它们。
  4. 在 Mac 上,这些命令的位置相同:公式 选项卡,错误检查,然后是 循环引用。

修正列表中显示的单元格,然后再检查一次列表:一个工作簿可能有好几个循环,第一个消除后 Excel 会列出下一个。

间接循环引用

经过两个或更多单元格的循环更难发现,因为没有哪个公式直接引用自己所在的单元格。

C2:  =B2*10%      tax on the net price in B2
B2:  =D2-C2       net price = total minus tax
D2:  =B2+C2       total = net plus tax

每个公式单独看都合理,但 B2 需要 C2,C2 需要 B2,D2 又需要这两者。三个值中必须有一个是输入值。确定你真正知道的是哪个数字,把它直接输入,再用它算出其他值:

不产生循环的净价、税额和总价
C2
ABCD
1ItemNet priceTax (10%)Total
2Desk$240.00$24.00$264.00
3Chair$85.00$8.50$93.50
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

净价是直接输入的,税额和总价由它算出:书桌价格 264.00,其中税额264.00,其中税额 24.00。如果你知道的是总价,那么净价就是 =D2/(1+10%):公式直接解出未知数,不会有任何单元格引用回自己。

合计中包含自身的占比

当合计把占比列也加了进去,或者合计行落在占比所除的区域之内时,占比列就会变成循环引用。

占合计的比例
C2
ABC
1RegionSalesShare
2North42042%
3South31031%
4East18018%
5West909%
6Online00%
7Total1000100%
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

每个占比都除以 B7,而 B7 只加总 B2:B6。线上渠道没有销售额,所以占比为 0%,C7 把各占比加起来正好是 100%。如果 B7 写成 =SUM(B2:B7) 或 =SUM(B2:C6),每个占比都会依赖它自己。$B$7 中的 $ 让公式向下填充时合计保持固定;参见百分比。

指向本行的累计余额

累计余额是把每笔新金额加到上一行的余额上。如果指向同一行的余额,就形成了循环。

C3:  =C3+B3    circular
C3:  =C2+B3    previous balance plus this row's amount
累计余额
C3
ABC
1DateAmountBalance
22026-03-01500500
32026-03-04-120380
42026-03-09-80300
52026-03-15250550
62026-03-22-60490
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

第一个余额就是第一笔金额;之后每一行都把自己的金额加到上一行上。最终余额为 490。点击 C4,彩色框显示的是 C3 和 B4,绝不会是 C4 自己。

按扣除提成后的利润计算提成

有些循环引用并不是输入错误,而是计算本身确实依赖自己的结果:提成为利润的 10%,而利润是支付提成之后剩下的部分。

B5 (commission):  =B6*B4         10% of profit
B6 (profit):      =B2-B3-B5      revenue minus cost minus commission

开启迭代计算(文件 > 选项 > 公式 > 启用迭代计算,Mac 上为 Excel > 偏好设置 > 计算)可以让 Excel 反复计算这个循环,直到数值稳定。在这里它确实能用,但它也会掩盖工作簿中所有意外产生的循环,而且有些循环永远不会稳定。更好的做法是解方程。如果提成等于费率乘以(收入减成本减提成),那么提成就等于(收入减成本)乘以费率,再除以(1 + 费率)。

不产生循环的提成
B5
AB
1ItemValue
2Revenue$50,000.00
3Cost$30,000.00
4Rate10%
5Commission
6Profit$20,000.00
7Rate of profit$2,000.00
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 在 B5 中写出提成,且不引用 B5 或 B6:提成是扣除提成后利润的 10%,换算下来就是(收入减成本)乘以费率,再除以 1 加费率。

当 B5 正确时,B7(利润的 10%)等于 B5 中的提成:两者都显示 $1,818.18。这个相等关系,正是循环版本想要达到的条件。

常见问题

Excel 中的循环引用是什么?

一个需要用到自身结果才能计算的公式。它可以直接引用自己所在的单元格,比如 B7 中的 =SUM(B2:B7),也可以通过其他单元格绕回来,比如 A1 为 =B1+1、B1 为 =A1*2。Excel 无法完成计算,于是发出警告,并显示 0 或上一次的值。

如何在 Excel 中找到循环引用?

看窗口底部的状态栏:它会显示 循环引用,后面跟着一个单元格地址。或者打开 公式 > 错误检查(点它旁边的箭头)> 循环引用,这里会列出相关单元格;点击其中一个即可跳转过去。

为什么 Excel 提示有循环引用,我却找不到?

状态栏只显示当前工作表中的循环引用,所以要逐个切换工作表,并在每个工作表中检查 公式 > 错误检查 > 循环引用。循环也可能经过某个定义的名称或另一个工作表中的单元格,所以请从列出的单元格开始使用 追踪引用单元格 顺藤摸瓜。

应该开启迭代计算来解决循环引用吗?

只有在循环是有意为之时才开启,比如一个会收敛到某个值的模型。文件 > 选项 > 公式 > 启用迭代计算 会让 Excel 重复计算最多 100 次,而不再发出警告。对于意外产生的循环,它只会掩盖错误,结果也可能是错的。

Coddy 编程语言插图

和 Coddy 一起学编程

开始