2013-10-10 70 views
1

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

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和在顶部电池余进入=试验(A1:A2)和命中移位输入。这用一个数组公式来填充范围,该公式应该从测试函数接收y()。

但是,引用函数的单元格都是零。我把调试线,我可以告诉该功能正在按预期运行。它只是没有将数组传递给电子表格。

这是怎么回事?有没有其他人有这种经验?


@RDHS,@ tim-williams和@ garys-student - 感谢您提供现场答案。还有加里的学生 - 谢谢你的快速反应。我会为大家投票,但我不能'因为我是小白。

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

显然,这是很容易的检查范围的形状,并相应地改变它(当然,这很容易,现在你已经展示了我如何!),但它是如此草率:

使用上面的例子,而不是只是写 测试= Y

我需要写:

如果x.rows.count = 1个,则 测试= Y
否则 测试= worksheetfunction.transpose(Y) 结束时,如果

我不了解你,但我会拿第一门(测试= y)。另一种方式是SOOOO马虎。 (C1:C10,3)和索引(C1:C10,3)和索引(C1:C10,3)的索引(索引,匹配等等)的内置电子数组表格a3:k3,3)都返回C3中的值,这是每个ARRAY中的第三个ITEM。索引足够聪明,可以确定哪个是第三个项目。当然,如果你可以在工作表上做到这一点,那么在VBA中必须有办法做到这一点?

我的最爱Comp。科学。教授 - 计算机科学领域的创始人之一 - 曾经说过:“当程序需要关注无关紧要的时候,程序设计语言是低层次的。”

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

  • “在计算中,把明显的为有用的词‘无奈’的生动定义”;

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

  • “傻瓜忽略复杂性,实用主义者承受它,有些人可以避免它,天才将它去除。

我带他,因为产生“干净”的代码的愿望去的方式回到第一个计算机上的第一个编码器。我非常喜欢他。

+2

选择单元格的4x4网格,并尝试对这些公式。这将变得很清楚,你的问题是(1)这个数组设置为一行,而不是一列,(2)你的数组索引从0开始,所以行中的第一个值是空的。 – Chel

+0

'ReDim y(3)'将上限设置为3(除非您使用'Option Base 1',否则下限为零,因此它将有4个元素) –

+0

RDHS,Tim​​和Gary的学生 - 感谢您的光临 - 答案。 – tpkaplan

回答

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