1

我已经多次将数组从电子表格传递到 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

我需要写:

if x.rows.count=1 then test = y
else test = worksheetfunction.transpose(y) end if

我不了解你,但我会选择 1 号门(测试=y)。另一种方式太草率了。

但是 MS 对我们持保留态度 - 使用内置电子表格数组函数(如索引、匹配等)时,excel 不会强迫你做这些体操...... Index(C1:C10,3) 和 index(a3:k3, 3) 两者都返回 C3 中的值,这是每个 ARRAY 中的第三个项目。索引足够聪明,可以找出第三项。当然,如果您可以在工作表上做到这一点,那么一定有办法在 VBA 中做到这一点?

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

他实际上做了很多有见地的观察,并通过 ARPANET 分发,使他成为世界上最早的博主之一(谷歌艾伦佩利斯)。二十年来,每个程序员都在他的 VT100 上贴了一张 Perlisism 列表——比如:

  • “在计算中,将显而易见的东西变成有用的东西是‘挫折’这个词的生动定义”;

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

  • “傻瓜会忽略复杂性。实用主义者会受苦。有些人可以避免它。天才会消除它。”

我提出他是因为产生“干净”代码的愿望可以追溯到第一台计算机上的第一批编码人员。我非常喜欢他。

4

1 回答 1

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
于 2013-10-10T23:05:09.883 回答