获取Excel INDEX函数find的值的单元格引用
问题
假设活动单元格包含基于INDEX
函数的公式:
=INDEX(myrange, x,y)
我想build立一个macros,它通过INDEX
find值的find值,并将焦点移到那里,这是一个macros,将活动单元格更改为:
Range("myrange").Cells(x,y)
做这个工作没有macros(慢,但它的作品)
除了myrange
地将select移动到myrange
并手动计算x
行y
和列之外,还可以:
-
复制公式并粘贴到另一个单元格中,如下所示:
=CELL("address", INDEX(myrange, x,y))
(显示由INDEX匹配的单元格的地址)。
-
复制上面的公式的结果。
-
Ctrl-V
F5
,Ctrl-V
,Enter
(将复制的地址粘贴到GoTo
对话框中)。
您现在位于由INDEX
函数find的非常单元格中。
现在的挑战是用macros来自动执行这些步骤(或类似的步骤)。
暂定的macros(不工作)
暂定1
WorksheetFunction.CELL("address", ActiveCell.Formula)
由于某些原因, CELL
不起作用,因此不属于WorksheetFunction
的成员。
暂定2
这个方法涉及parsingINDEX
formula。
Sub GoToIndex() Dim form As String, rng As String, row As String, col As String form = ActiveCell.Formula form = Split(form, "(")(1) rng = Split(form, ",")(0) row = Split(form, ",")(1) col = Split(Split(form, ",")(2), ")")(0) Range(rng).Cells(row, CInt(col)).Select End Sub
这个方法实际上可行,但只适用于一个简单的情况,其中主要的INDEX
Formula没有嵌套的子公式。
注意
显然,在真实情况下myrange
, x
和y
可以是简单的值,例如=INDEX(A1:D10, 1,1)
myrange
=INDEX(A1:D10, 1,1)
或从复杂expression式返回的值。 通常x
, y
是MATCH
函数的结果。
编辑
有人发现,当myrange
位于与hosting =INDEX(myrange ...)
不同的工作表上时,某些解决scheme不起作用。
它们在财务报告中是常见的做法,其中一些表格具有通过INDEX+MATCH
公式从其他条目中回收其条目的主要报表。
不幸的是,只是当发现的值位于远处的报告中时,你需要更多的跳转到单元格的function。
任务可以比其他方法简单得多:
Sub GoToIndex() Application.Evaluate(ActiveCell.Formula).Select End Sub
Application.Evaluate(ActiveCell.Formula)
返回一个范围对象,CELL函数从表单中调用该属性。
编辑对于从另一张纸进行导航,您应该先激活目标纸张:
Option Explicit Sub GoToIndex() Dim r As Range Set r = Application.Evaluate(ActiveCell.Formula) r.Worksheet.Activate r.Select End Sub
为一般情况添加error handling:
Option Explicit Sub GoToIndex() Dim r As Range On Error Resume Next ' errors off Set r = Application.Evaluate(ActiveCell.Formula) ' will work only if the result is a range On Error GoTo 0 ' errors on If Not (r Is Nothing) Then r.Worksheet.Activate r.Select End If End Sub
有几种方法可以select公式引用的单元格…
假设活动单元格包含: =INDEX(myrange,x,y)
。
在工作表中,您可以尝试以下任何一种方法:
- 从公式栏复制公式并粘贴到名称框中(在公式栏的左侧)
- 将公式定义为名称,
A
。 然后在转到框或(名称框)中键入A
, - 插入超链接>现有文件或网页>地址:
#INDEX(myrange,x,y)
- 修改公式以使其成为超链接:
=HYPERLINK("#INDEX(myrange,x,y)")
或者从VBA编辑,这些都应该做的伎俩:
-
Application.Goto Activecell.FormulaR1C1
-
Range(Activecell.Formula).Select
附加说明 :
如果单元格包含引用相对引用的公式,例如=INDEX(A:A,ROW(),1)
则最后一个将需要一些调整。 (另请参阅: Excel评估公式错误 )。 为了做到这一点,你可以尝试:
Range(Evaluate("cell(""address""," & Mid(ActiveCell.Formula, 2) & ")")).Select
在Application.Goto
使用的R1C1引用或者:
ThisWorkbook.FollowHyperlink "#" & mid(ActiveCell.FormulaR1C1,2)
您可以使用MATCH()工作表函数或VBA FIND()方法。
编辑#1
正如您正确指出的那样, INDEX将会返回一个在该范围内可能出现多次的值,但是INDEX总是会从某个固定点返回一个值,比如说
=INDEX(A1:K100,3,7)
将始终给单元格G3的值,所以地址是“内置”的公式
但是,如果我们有这样的事情:
=INDEX(A1:K100,Z100,Z101)
那么我们需要一个macros来parsing公式并评估参数。
@lori_m和@VB几乎同时以自己的方式给出了出色的解决scheme。 我很难select闭幕答案,但VB甚至创build了Dropboxtesting文件,所以…
在这里,我只是从他们的部分窃取最好的。
'Move to cell found by Index() Sub GoToIndex() On Error GoTo ErrorHandler Application.Goto ActiveCell.FormulaR1C1 ' will work only if the result is a range Exit Sub ErrorHandler: MsgBox ("Active cell does not evaluate to a range") End Sub
我将这个“跳转”macros与CTRL-j关联起来,它就像一个魅力。
如果你使用资产负债表像工作表(其中INDEX
formulaula,从其他表中select条目,很常见),我真的build议你去尝试。