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

时间:2014-02-14 12:06:27

标签: excel vba excel-vba

问题

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

=INDEX(myrange, x,y)   

我想构建一个宏来定位INDEX找到的值,并将焦点移到那里,即将宏更改为活动单元格

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

在没有宏的情况下完成工作(缓慢但有效)

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

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

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

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

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

  3. 点击F5Ctrl-VEnter(将复制的地址粘贴到GoTo对话框中)。

  4. 您现在位于INDEX函数找到的单元格上。

    现在的挑战是使用宏自动执行这些步骤(或类似步骤)。

    暂定宏(不工作)

    暂定1

    WorksheetFunction.CELL("address", ActiveCell.Formula)
    

    由于CELL由于某种原因不属于WorksheetFunction成员,因此不起作用。

    暂定2

    此方法涉及解析INDEX - 公式。

    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 - 公式没有嵌套子公式的简单情况。

    注意

    显然,在实际案例myrange中,xy可以是简单值,例如=INDEX(A1:D10, 1,1),也可以是复杂表达式返回的值。通常xyMATCH函数的结果。

    修改

    发现当myrange位于与托管=INDEX(myrange ...)不同的工作表上时,某些解决方案无效。

    它们是财务报告中的常见做法,其中一些表格具有主要陈述,其条目通过INDEX+MATCH公式从其他人处召回。

    不幸的是,当发现的值位于“远”报告上时,您需要更多的跳转到单元格功能。

4 个答案:

答案 0 :(得分:1)

任务可以在一行中完成,比任何其他方法简单得多:

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

为一般情况添加错误处理:

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

答案 1 :(得分:1)

有几种方法可以选择公式所指的单元格......

假设活动单元格包含:=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 Evaluate formula error)。为此,您可以尝试:

Range(Evaluate("cell(""address""," & Mid(ActiveCell.Formula, 2) & ")")).Select

Application.Goto或:

中使用的R1C1引用似乎不会出现此问题
ThisWorkbook.FollowHyperlink "#" & mid(ActiveCell.FormulaR1C1,2)

答案 2 :(得分:0)

您可以使用MATCH()工作表函数或VBA FIND()方法。

修改#1

正如您正确指出的那样, INDEX 将返回一个可能在该范围内出现多次的值,但 INDEX 将始终从某个固定点返回一个值,比如说

=INDEX(A1:K100,3,7)

将始终在单元格 G3 中给出值,因此地址“内置”到公式

但是,如果我们有类似的话:

=INDEX(A1:K100,Z100,Z101)

然后我们需要一个宏来解析公式并评估参数。

答案 3 :(得分:0)

@lori_m和@ V.B。几乎并行地以自己的方式提供了出色的解决方案。 我很难选择结束答案,但V.B.甚至创建了Dropbox测试文件,所以......

在这里,我只是从他们的部分偷走了最好的。

'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

我将此“跳转”宏与CTRL-j相关联,它就像一个魅力。

如果你使用资产负债表,如工作表(其中INDEX - 公式,从其他表格中选择条目,非常常见),我真的建议你试试。