【发布时间】:2015-09-28 14:28:21
【问题描述】:
如果我用一个例子来解释这可能是最好的......
假设我们在工作表单元格A1:C1 中包含值[1,2,3]。
我想取每个数字的平方,但我使用单元格公式执行此操作,因此在单元格 A2 中我有 {=A1:C1^2}。这是一个数组公式。但是,如果我只在单元格A2 中按ctrl+alt+enter,我会看到数组的第一个元素平方(i.e. A1^2 = 1^2 = 1)。
如果我选择所有A2:C2 并点击ctrl+alt+enter,它会将整个数组公式扩展到三个单元格,我们会看到[1,4,9] 的结果。
我想要的是只需将数组公式放在单元格A2 中并编写 VBA 即可访问整个数组以进行整个操作(即A1:C1^2)。
我不想在 VBA 中再次执行该函数,因为当我们在单元格 A2 中执行 {=A1:C1^2} 时,数组必须已经存储在内存中,所以我怎样才能从单个单元格中获取整个数组结果更大数组的一部分?
注意:这只是一个示例,我计划对未知大小的大型数组执行此操作。
【问题讨论】:
-
那么您想将整个数组存储在一个单元格中然后能够访问它吗?这不是数组公式的工作方式。在您的示例中——实际上只有值 1 存储在
A2中(=SUM(A2)返回 1,而不是 14——即使您将总和作为数组公式输入)。您可以将值组合成带有一些分隔符的字符串,然后使用 VBA 拆分字符串并提取值,尽管这很少比动态计算值更有效。 -
您是说希望 VBA 自动填充整个“数组”的公式吗?也就是说,您要开始在 A2 中输入一个公式,然后选择 A1:C1,然后输入您的运算结果为“=A1:C1^2”;然后按 ctrl-shift-enter 使其成为数组公式;那么你想让 VBA 自动填充到 B2 和 C2 中吗?
-
我认为 {=(A1:C1)^2} 会返回一个数组,Excel 然后知道这是一个数组,并根据所选区域的大小,输出结果数组的元素.本质上,这是我要问的一个更基本的问题 - 当您告诉 Excel 执行单元格公式时,它是否会计算整个公式,然后根据用户提供的区域确定要打印出多少元素?或者,它只是根据所选区域逐个元素地计算数组吗?
-
@as9422 好问题。由于数组通常是在循环中计算的,我怀疑 Excel 只计算所需的数组。其他任何事情都是低效的。
-
@JohnColeman 我是这么认为的 - 听到有点令人沮丧,但我有一半的预期是不可能完全按照我的要求执行。谢谢你的帮助!编辑:虽然 - 你知道是否可以告诉 VBA 不执行同一工作簿中其他人正在调用的函数?这可能是我的问题的一种解决方法(这一切都表明我不想在刷新时执行相同的函数两次)。