获取Excel INDEX函数find的值的单元格引用

问题

假设活动单元格包含基于INDEX函数的公式:

 =INDEX(myrange, x,y) 

我想build立一个macros,它通过INDEXfind值的find值,并将焦点移到那里,这是一个macros,将活动单元格更改为:

 Range("myrange").Cells(x,y) 

做这个工作没有macros(慢,但它的作品)

除了myrange地将select移动到myrange并手动计算xy和列之外,还可以:

  1. 复制公式并粘贴到另一个单元格中,如下所示:

     =CELL("address", INDEX(myrange, x,y)) 

    (显示由INDEX匹配的单元格的地址)。

  2. 复制上面的公式的结果。

  3. Ctrl-V F5Ctrl-VEnter (将复制的地址粘贴到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没有嵌套的子公式。

注意

显然,在真实情况下myrangexy可以是简单的值,例如=INDEX(A1:D10, 1,1) myrange =INDEX(A1:D10, 1,1)或从复杂expression式返回的值。 通常xyMATCH函数的结果。

编辑

有人发现,当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议你去尝试。