【发布时间】:2012-01-30 03:54:51
【问题描述】:
我有一个工作表,它从同一个工作簿 (=data!C68) 中的不同工作表返回一个值,该工作表返回一个值。
在另一个单元格中,我想引用原始单元格中的引用,但将行增加 1 - (=data!C69)。单元格不相邻。
这是否可以通过函数或 fromula 实现?
谢谢
乔纳森
【问题讨论】:
我有一个工作表,它从同一个工作簿 (=data!C68) 中的不同工作表返回一个值,该工作表返回一个值。
在另一个单元格中,我想引用原始单元格中的引用,但将行增加 1 - (=data!C69)。单元格不相邻。
这是否可以通过函数或 fromula 实现?
谢谢
乔纳森
【问题讨论】:
Option Explicit
Function GetCellReferenceUsedInFormula(ByVal src As Range) As Range
If src.HasFormula Then
Set GetCellReferenceUsedInFormula = Evaluate(Mid(src.Formula, 2))
End If
End Function
并在公式中使用上述函数OFFSET
=OFFSET(GetCellReferenceUsedInFormula(A1),1,0)
这是假设单元格 A1 包含公式 =data!C68。
请注意,VBA 代码假定公式很简单(即=somecellreference)。
【讨论】:
有很多方法可以实现这一点。这是一种方法。我通过合并要偏移的行和列来扩展该功能。将此代码粘贴到模块中
语法
=GetOffset(Range,Row,Col)
备注
范围(必填)是具有公式的单元格
行(可选)要偏移的行
Col(可选)要偏移的列
示例用法
=GetOffset(A1) :这将从 A1 所指的同一单元格中获取值。如果 A1 指的是=data!C69,那么 GetOffset 将从数据中获取价值!C69
=GetOffset(A1,1) :这将从 A1 所指的下一个单元格(向下 1 行)获取值。如果 A1 指的是=data!C69,那么 GetOffset 将从数据中获取价值!C70
=GetOffset(A1,1,1) :这将从 A1 所指的下一个单元格(跨 1 Col 向下 1 行)获取值。如果 A1 指的是=data!C69,那么 GetOffset 将从数据中获取价值!D70
=GetOffset(A1,0,1) :这将从 A1 所指的下一个单元格(跨 1 Col 的同一行)获取值。如果 A1 指的是=data!C69,则 GetOffset 将从数据中获取值!D69
代码
Public Function GetOffset(Rng As Range, Rw As Long, Col As Long) As Variant
Dim MyArray() As String, strTemp As String
Dim TempRow As Long, TempCol As Long
On Error GoTo Whoa
Application.Volatile
MyArray = Split(Rng.Formula, "!")
TempRow = Range(MyArray(UBound(MyArray))).Row
TempCol = Range(MyArray(UBound(MyArray))).Column
TempRow = TempRow + Rw
TempCol = TempCol + Col
strTemp = MyArray(0) & "!" & Cells(TempRow, TempCol).Address
GetOffset = Application.Evaluate(Trim(strTemp))
Exit Function
Whoa:
End Function
【讨论】:
Application.Volatile 不是一个好习惯。即,只要工作表上发生计算事件,无论是否有任何依赖单元格发生更改,VBA 代码都会执行。
Function test2() As String Application.Volatile test2 = "Hello world" msgbox "why is it hitting here?" End Function 之类的小函数,并在 Excel 单元格 (B1) 中使用它。然后在单元格 A1 中输入值 1,在单元格 A2 中输入值 2 并在单元格 A3 中输入公式 =SUM(A1:A2),您会看到 test2 函数被调用,我认为这是不应该发生的。现在,将单元格 A1 中的值更改为 2(这将触发单元格 A3 重新计算)。我问一个问题,当它的依赖参数都没有改变时,为什么这个函数要重新计算自己?