轻松引用偏移中的单元格

时间:2012-05-24 13:17:46

标签: excel vba reference

我有一个工作表,其中包含许多公式,这些公式在上方或右侧显示一个单元格。如果我使用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

5 个答案:

答案 0 :(得分:2)

= INDIRECT(“R”& ROW() - 1&“C”& COLUMN(),FALSE)将作为一个函数。

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

我相信你可以做一些更简单的事情:

OFFSET(CurrentCell,-1,0)

但我看不出你如何引用当前的单元格。

答案 1 :(得分:1)

由于您的功能正常工作,所以您需要的只是在插入行时重新计算。 你说:

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

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

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

这可能会影响效果,但似乎是你要求的。

答案 2 :(得分: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

答案 3 :(得分: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”功能的能力,因为每个单元基本上只引用它自己。

答案 4 :(得分:0)

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

插入空行

第1步

将公式从B2拖到B3或只需选择B3并按CTL D

第2步

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

enter image description here