【问题标题】:Converting a VBA array into a "column" array将 VBA 数组转换为“列”数组
【发布时间】:2017-01-05 08:48:24
【问题描述】:

据我所知,Excel 中的数组有两种表示形式:

{1,2,3,4} also known as "one-dimensional horizontal array"

{1;2;3;4} also known as "one-dimensional vertical array"

我创建了一个返回数组的 VBA 函数,但是当我在需要数组的函数 (SUMPRODUCT) 中使用它时,Excel 会用逗号显示它。所以它总是把它解释为一个水平数组。如果我想让产品具有另一个水平阵列,这很好,但是当我尝试使用垂直阵列时它不起作用。

VBA:

Function MyRange()
    Dim output(2)
    output(0) = 1
    output(1) = 1
    output(2) = 1
    MyRange = output
End Function

Excel

=SUMPRODUCT(MyRange();{1,1,1}) works
=SUMPRODUCT(MyRange();{1;1;1}) is not working

我的问题?

如何让 Excel 在第一个数组中显示 {1;1;1} 而不是 {1,1,1} ?

【问题讨论】:

  • =SUMPRODUCT(TRANSPOSE(MyRange());{1;1;1})?
  • @ScottCraner 如果你想创建一个答案。我会接受的。非常感谢!
  • 或者在 VBA 中可能是 INDEX({1;1;1},0,1)MyRange = Application.Transpose(output)
  • @Slai Nice catch 直接在 VBA 中使用 TRANSPOSE。它有效!

标签: arrays vba excel-2010


【解决方案1】:

使用转置切换:

=SUMPRODUCT(MyRange();TRANSPOSE({1;1;1}))

【讨论】:

  • 真的很奇怪。它在函数向导中看起来很完美,但 Excel 仍然返回 #VALUE!当我点击确定时!
  • 我将 TRANSPOSE 放在另一部分 =SUMPRODUCT(MyRange();TRANSPOSE({1;1;1})) 上,现在可以正常工作了!非常感谢!
  • 最后,不幸的是,对我来说,TRANSPOSE 似乎只适用于“硬编码”数组。如果我使用另一个 EXCEL 函数,例如 TRANSPOSE(--(WEEKDAY(D3:D1257,3)<5))--(TRANSPOSE(WEEKDAY(D3:D1257,3))<5),向导会正确显示它,但不会在单元格中显示 :(
  • 我遵循@Slai 的建议并将 TRANSPOSE 直接放在 VBA 中就可以了:) TRANSPOSE 是正确的方向。谢谢!
【解决方案2】:

另一个更快一点的选择是使用“垂直”数组(未测试):

Function MyRange()
    Dim output(1 To 3, 1 To 1)
    output(1, 1) = 1
    output(2, 1) = 2
    output(3, 1) = 3
    MyRange = output
End Function

或者慢一点(也没有测试):

Function MyRange()
    MyRange = [{1;2;1}]
    MyRange(3, 1) = 3
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多