将数组从Excel VBA函数传递到电子表格

时间:2013-10-10 22:55:04

标签: arrays excel function vba

我已经多次从电子表格到VBA函数来回传递数组。我最近“升级”到Excel 365,现在我无法让它工作。例如:

Public Function test(x As Range)
  Dim y()
  ReDim y(3)
  y(1) = 1
  y(2) = 2
  y(3) = 3
  test = y
End Function

然后我突出显示三个单元格,例如b1:b3,在顶部单元格中输入= test(a1:a2)并按下shift-enter。这填充了一个数组公式,该公式应该从测试函数接收y()。

但是,引用该函数的单元格全为零。我输入调试行,我可以告诉函数按预期运行。它只是没有将数组传递给电子表格。

这是怎么回事?还有其他人有这种经历吗?


@RDHS,@ tim-williams和@ garys-student - 谢谢你的现场答案。和Gary的学生 - 感谢非常快速的回应。我会投票给所有人,但我不能'因为我是菜鸟。

但是......为了完整起见 - 你的答案提出了另一个问题(更理论的类型):我应该能够直接将一维数组强制转换为范围列,反之亦然。

显然,检查范围的形状并相应地对其进行转换是很容易的(好吧,现在很容易让你告诉我如何!)但它太草率了:

使用上面的例子,而不仅仅是写作   test = y

我需要写:

如果x.rows.count = 1那么   test = y
其他   test = worksheetfunction.transpose(y) 结束如果

我不了解你,但我会拿门#1(test = y)。另一种方式是SOOOO马虎。

但MS坚持我们 - 在使用内置的电子表格数组函数(如索引,匹配等)时,excel不会强迫你做那些体操...索引(C1:C10,3)和索引(a3) :k3,3)都返回C3中的值,这是每个ARRAY中的第三个ITEM。索引很聪明,可以确定哪个是第三项。当然,如果你可以在工作表上做到这一点,必须有办法在VBA中进行吗?

我最喜欢的Comp。科学。教授 - 计算机科学领域的创始人之一 - 曾经说过,“当程序需要关注无关紧要时,编程语言是低级别的。”

他实际上做了很多富有洞察力的观察,他分布在ARPANET上,使他成为世界上第一批博主(Google Alan Perlis)。二十年来,每个程序员都有一个超过他的VT100的Perlisisms列表 - 如:

  • “在计算中,将明显变为有用的是对'挫折'一词的生动定义”;

  • “一个人的常数是另一个人的变量”;

  • “傻瓜忽视复杂性。实用主义者会受其影响。有些人可以避免它。天才会删除它。”

我支持他,因为产生“干净”代码的愿望可以追溯到第一台计算机上的第一批编码器。而且我非常喜欢他。

1 个答案:

答案 0 :(得分:0)

尝试一下:

Public Function test(x As Range)
  Dim y()
  ReDim y(3)
  y(0) = 1
  y(1) = 2
  y(2) = 3
  test = WorksheetFunction.Transpose(y)
End Function