有没有办法让索引公式在更新数组后自动重新引用数组?

问题描述 投票:0回答:1

所以我有一个索引匹配公式,它使用同一工作簿中的第二个工作表来显示数据。 公式看起来像这样

=INDEX([sheet15]BUTTON!A:C,MATCH(INDIRECT(CELL("address")),[sheet15]BUTTON!A:A,0),3)

此公式匹配名为“按钮”的工作表中的选定单元格,然后返回第一个工作表中匹配单元格右侧的一个单元格。我有多个单元格返回行的不同部分。即上面的返回行中的第三列,其他返回第四列、第五列、第七列和第八列,所有更改的是括号之前的最后一个数字。

要将“按钮”工作表中的信息获取到第一个工作表中,您只需选择一个单元格(出于上下文原因,这些是我的工作表中的运行编号),然后按 f9 刷新工作表,它将在相关框中返回信息。然后,下次您按 f9 并选择不同的运行编号时,框会相应更改。

我遇到的问题是,当我用新信息更新按钮表时,公式不会返回新数据的任何匹配信息,之前存在的所有旧数据仍然可以正常工作,但任何新数据都可以返回#N/A,就好像没有数据与之匹配一样。我可以通过单击包含公式的单元格内部然后按 Enter 键来使其工作,然后按 Enter 键,然后打开 Windows 文件查找器并要求我选择一个 Excel 工作簿用作数组。然后我选择相同的工作簿,它现在将返回新数据。

所以我的问题是,当我更新其中包含公式的每个单元格的数据时,有没有办法自动重新引用数组(当我更新数据时,它在打开的完全不同的工作簿上使用宏)几个工作簿,然后将新数据复制并粘贴到其中),并且由于我在大约 14 个工作簿中具有相同的单元格设置和公式,因此我不想每次更新时都必须遍历每个工作簿并重新引用数组他们。

如有任何帮助,我们将不胜感激。

因此,在尝试录制宏之后,我设法将其调出一个文件查找器窗口来选择工作表,但我很难找到一种方法让 vba 从窗口中选择文件。请参阅下面的宏代码。

Sub Macro2()
'
' Macro2 Macro
'

'
    Range("D4:M7").Select
    ActiveCell.Formula2R1C1 = _
        "=INDEX([sheet15]BUTTON!C[-3]:C[-1],MATCH(INDIRECT(CELL(""address"")),[sheet15]BUTTON!C[-3],0),3)"
    Range("N4:X7").Select
    ActiveCell.Formula2R1C1 = _
        "=INDEX([sheet15]BUTTON!C[-13]:C[-11],MATCH(INDIRECT(CELL(""address"")),[sheet15]BUTTON!C[-13],0),2)"
    Range("Y4:AD5").Select
    ActiveCell.Formula2R1C1 = _
        "=INDEX([sheet15]BUTTON!C[-24]:C[-17],MATCH(INDIRECT(CELL(""address"")),[sheet15]BUTTON!C[-24],0),7)"
    Range("Y6:AD7").Select
    ActiveCell.Formula2R1C1 = _
        "=INDEX([sheet15]BUTTON!C[-24]:C[-17],MATCH(INDIRECT(CELL(""address"")),[sheet15]BUTTON!C[-24],0),8)"
    Range("Y8").Select
End Sub

正如我之前所说,当它运行时,它会打开一个文件查找器窗口并要求我选择一个文件。工作簿的名称是 TOLEDO,这也是我希望它引用的文件,那么如何编写选择 TOLEDO,然后单击“确定”按钮? (请注意,我实际上并没有打开此处的工作表,我只是选择一个文件来引用数组)

excel vba array-formulas
1个回答
0
投票

而不是这个:

=INDEX([sheet15]BUTTON!A:C,MATCH(INDIRECT(CELL("address")),[sheet15]BUTTON!A:A,0),3)

你可以这样写你的公式:

=INDEX(BUTTON!C:C,MATCH(INDIRECT(CELL("address")),BUTTON!A:A,0),1)

(没有

[sheet15]
),这将解决包含新数据的问题。

此外,为了避免每次想要显示新值时都必须按 F9,您可以捕获选择事件并自动触发计算:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'recalculate if a cell in ColB is selected
    If Not Intersect(Target, Me.Columns("B")) Is Nothing Then Me.Calculate
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.