我已经多次从电子表格到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列表 - 如:
“在计算中,将明显变为有用的是对'挫折'一词的生动定义”;
“一个人的常数是另一个人的变量”;
“傻瓜忽视复杂性。实用主义者会受其影响。有些人可以避免它。天才会删除它。”
我支持他,因为产生“干净”代码的愿望可以追溯到第一台计算机上的第一批编码器。而且我非常喜欢他。
答案 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