假设活动单元格包含基于INDEX
函数的公式:
=INDEX(myrange, x,y)
我想构建一个宏来定位INDEX
找到的值,并将焦点移到那里,即将宏更改为活动单元格:
Range("myrange").Cells(x,y)
除了将选择移动到myrange
并手动计算x
行y
和列之外,还可以:
将公式复制并粘贴到另一个单元格中,如下所示:
=CELL("address", INDEX(myrange, x,y))
(显示INDEX匹配的单元格的地址)。
复制上面公式的结果。
点击F5
,Ctrl-V
,Enter
(将复制的地址粘贴到GoTo
对话框中)。
您现在位于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
中,x
和y
可以是简单值,例如=INDEX(A1:D10, 1,1)
,也可以是复杂表达式返回的值。通常x
,y
是MATCH
函数的结果。
发现当myrange
位于与托管=INDEX(myrange ...)
不同的工作表上时,某些解决方案无效。
它们是财务报告中的常见做法,其中一些表格具有主要陈述,其条目通过INDEX+MATCH
公式从其他人处召回。
不幸的是,当发现的值位于“远”报告上时,您需要更多的跳转到单元格功能。
答案 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
或:
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
- 公式,从其他表格中选择条目,非常常见),我真的建议你试试。