【发布时间】:2013-10-10 22:55:03
【问题描述】:
我已经多次将数组从电子表格传递到 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 的学生 - 感谢您的快速反应。我会投票给每个人,但我不能因为我是菜鸟。
但是...为了完整起见-您的回答提出了另一个问题(更具理论性):我应该能够将一维数组直接强制转换为范围列,反之亦然。
显然,检查范围的形状并相应地对其进行转换是很容易的(好吧,现在你已经向我展示了如何做,这很容易!)但是它太草率了:
使用上面的例子,而不是仅仅写 测试 = y
我需要写:
如果 x.rows.count=1 那么
测试 = y
别的
测试 = worksheetfunction.transpose(y)
结束如果
我不了解你,但我会选择 1 号门 (test=y)。另一种方式太草率了。
但是 MS 对我们持保留态度 - 使用内置电子表格数组函数(如索引、匹配等)时,excel 不会强迫您做这些体操... Index(C1:C10,3) 和 index(a3 :k3,3) 都返回 C3 中的值,这是每个 ARRAY 中的第三个项目。索引足够聪明,可以找出第三项。当然,如果你可以在工作表上做到这一点,那么一定有办法在 VBA 中做到这一点??
我最喜欢的比较。科学。教授 - 计算机科学领域的创始人之一 - 曾经说过,“当程序需要关注不相关的内容时,编程语言是低级的。”
他实际上做了很多有见地的观察,并通过 ARPANET 分发,使他成为世界上最早的博主之一(Google Alan Perlis)。 20 年来,每个程序员都在他的 VT100 上贴了一张 Perlisism 列表——比如:
“在计算中,将显而易见的东西转化为有用的东西是‘挫折’这个词的活生生的定义”;
“一个人的常数是另一个人的变量”;
“傻瓜会忽略复杂性。实用主义者会受苦。有些人可以避免它。天才会消除它。”
我提出他是因为产生“干净”代码的愿望可以追溯到第一台计算机上的第一批编码人员。而且我很喜欢他。
【问题讨论】:
-
选择一个 4x4 的单元格网格并在这些单元格上尝试您的公式。很明显你的问题是(1)这个数组被设置为一行,而不是一列,(2)你的数组索引从 0 开始,所以行中的第一个值是空的。
-
ReDim y(3)将上限设置为 3(除非您使用Option Base 1,否则下限为零,因此它将有 4 个元素) -
RDHS,Tim 和 Gary 的学生 - 感谢您的及时回答。