[英]Passing arrays from an Excel VBA function to a spreadsheet
我已经多次将数组从电子表格来回传递给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键输入。 这用应该从测试函数接收y()的数组公式填充范围。
但是,引用该函数的单元格全为零。 我放入调试行,我可以告诉该函数正在按预期运行。 只是没有将数组传递给电子表格。
那是怎么回事? 有没有其他人有这种经验?
@ RDHS,@ tim-williams和@ garys-student-感谢您提出的即刻答复。 还有加里(Gary)的学生-感谢您的迅速回复。 我会投票给所有人,但我不能,因为我是菜鸟。
但是...出于完整性的考虑-您的答案提出了另一个问题(属于理论上的问题):我应该能够将一维数组直接强制转换为范围列,反之亦然。
显然,检查范围的形状并进行相应的转换很容易(嗯,既然您已经向我展示了操作方法,这很容易!)但是它太草率了:
使用上面的示例,而不仅仅是编写test = y
我需要写:
如果x.rows.count = 1,则测试= y
否则test = worksheetfunction.transpose(y)结束,如果
我不认识你,但我会乘1号门(test = y)。 另一种方法是马虎马虎。
但是MS一直在支持我们-当使用内置电子表格数组功能(例如索引,匹配等)时,excel不会强迫您进行这些体操操作。Index(C1:C10,3)和index(a3:k3, 3)都返回C3中的值,这是每个ARRAY中的第三个ITEM。 索引足够聪明,可以找出第三项。 当然,如果您可以在工作表上执行此操作,那么必须在VBA中找到一种方法?
我最喜欢的比较 科学 这位教授是计算机科学领域的奠基人之一。他曾经说过:“一种编程语言,如果程序中的程序需要引起人们的关注,那么它就是低级的。”
他实际上做了很多有见地的观察,并在ARPANET上发布,使他成为世界上第一批博客作者(Google Alan Perlis)之一。 二十年来,每个程序员在他的VT100上都贴有Perlisisms列表-例如:
“在计算中,将显而易见的东西变成有用的是'挫折'一词的活泼定义”;
“一个人的常数就是另一个人的变量”;
“愚人忽视了复杂性。实用主义者遭受了它的侵害。有些人可以避免它。天才将其消除。”
我之所以提出他,是因为产生“干净”代码的愿望可以追溯到第一台计算机上的第一批编码人员。 我非常喜欢他。
试试看:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.