我有一个工作表,其中包含许多公式,这些公式在上方或右侧显示一个单元格。如果我使用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
答案 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
。双击单元格的右下角进行自动填充。