1

我有一个包含许多公式的工作表,这些公式在上方或右侧的一个单元格中显示。如果我使用 ctrl-D 填充行,则公式会正确更新(因此 B2 中的 =B1 + A2 变为 B3 中的 =B2+A3)。但是当我在行之间插入时,事情变得一团糟(所以在 B3 上方插入一行,将其移动到 B4 使其公式变为 =B2+A4,这不是我想要的)

所以我想创建一个 CellAbove 和 CellRight 公式(所以我可以写 =CellAbove() + CellRight())。我怎样才能做到这一点?

我的尝试:

Function CellAbove()
   CellAbove = [Address(Row() - 1, Column())].Value
End Function

不起作用。

更新:下面的功能有效,但有它的单元格没有更新:

Function CellAbove()
   CellAbove = Range([Address(Row() - 1, Column())])
End Function

因此,如果 A1 有 2 而 A2 有 =CellAbove() 那么 A2 将显示 2。但是如果现在我将 A1 更改为 3,那么 A2 仍将显示 2

4

5 回答 5

2

=INDIRECT("R"&ROW()-1&"C"&COLUMN(),FA​​LSE) 将作为函数工作。

假设您在 B2 上。然后括号内的位将评估为 R1C2。然后,INIDRECT 函数将计算第 1 行第 2 列的内容(您需要 FALSE 以确保您使用的是 R1C1 样式的单元格地址)。

我相信您可以使用以下方法做一些更简单的事情:

偏移量(当前单元格,-1,0)

但我看不到您如何引用当前单元格。

于 2012-05-24T13:53:27.023 回答
1

由于您的功能有效,而且您似乎只需要在插入行时重新计算即可。你说:

“但是拥有它的单元格没有更新”

用户定义函数默认情况下不是易失性的,因此它们不会自动重新计算。您可以将现有功能更改为此。

Function CellAbove()
 Application.Volatile (True)
 CellAbove = Range([Address(Row() - 1, Column())])
End Function

这可能会影响性能,但似乎是您所要求的。

于 2012-05-24T14:36:51.980 回答
0

你的功能

Function CellAbove()
   CellAbove = Range([Address(Row() - 1, Column())])
End Function

Function CellRight()
   CellRight = Range([Address(Row(), Column() + 1)])
End Function

可以称为

Function test000000()
    ActiveCell = CellAbove + CellRight
End Sub
于 2012-05-24T13:53:12.020 回答
0

您可以使用内置的 Excel 函数(如 INDIRECT、ADDRESS、ROW 和 COLUMN)来执行此操作,如...

=INDIRECT(ADDRESS(ROW()-1,COLUMN()))

...对于上面的单元格,或者...

=INDIRECT(ADDRESS(ROW(),COLUMN()+1))

...对于右侧的单元格。

再次使用内置功能的另一种方法是使用 OFFSET 函数。例如,在单元格 B2 中,您可以输入公式...

=OFFSET(B2,-1,0)

...对于上面的单元格,或者...

=OFFSET(B2,0,1)

...对于右侧的单元格。它看起来像一个循环引用,但事实并非如此,因为您引用的不是同一个单元格的值,而是它的地址。

无论哪种方式,您都或多或少失去了使用“Trace Dependents”和“Trace Precedents”功能的能力,因为每个单元格基本上只引用自己。

于 2012-05-24T13:59:27.257 回答
0

跟进我的评论。我们不需要 vba :)

插入空白行后

第1步

将公式从 下拉B2B3或直接选择B3并按下CTL D

第2步

选择单元格B3。双击单元格的右下角进行自动填充。

在此处输入图像描述

于 2012-05-24T14:03:00.780 回答