【问题标题】:Is there a way to assign values to an Option Base 1 array in VBA using a single line?有没有办法使用单行将值分配给 VBA 中的 Option Base 1 数组?
【发布时间】:2016-09-15 11:19:38
【问题描述】:

我将整数(总共 11 个)分配给索引为 1 到 11 的数组,一次一个索引。

有没有一种方法可以在一行中完成,类​​似于在 Matlab 中的完成方式。

我现在是怎么做的:

Dim cols(1 To 11) As Integer

cols(1) = 2
cols(2) = 3
cols(3) = 5
cols(4) = 6
cols(5) = 7
cols(6) = 9
cols(7) = 10
cols(8) = 13
cols(9) = 14
cols(10) = 15
cols(11) = 16

我想怎么做:

Dim cols(1 To 11) As Integer

cols = [2,3,5,6,7,9,10,13,14,15,16]

我知道它可以在不将变量定义为数组的情况下完成,但这会返回索引为 0 到 10 的数组:

Dim cols As Variant

cols = Array(2,3,5,6,7,9,10,13,14,15,16]

【问题讨论】:

  • For 循环? 3 行
  • 您可以将Option Base 1 添加到模块的顶部 - 您的最后一个示例将适用于 1 到 11。或者听从 Shai 的建议。

标签: arrays excel vba


【解决方案1】:

如果 Variant 数组没问题:

Dim cols()
cols = [{2,3,5,6,7,9,10,13,14,15,16}]

【讨论】:

  • 澄清:这是cols = Application.Evaluate("{2,3,5,6,7,9,10,13,14,15,16}") 的语法糖,它将字符串评估为 Excel 公式。
  • 嗯,[]Evaluate 并不完全相同,但对于大多数用途来说已经足够接近了。
  • Variant 数组已经足够了。在这种情况下它解决了我的问题,但是如果我需要索引为 2 To 12 或 7 to 17 怎么办?无论如何,您的回答对我有所帮助,我将其标记为已接受。感谢您的帮助!
  • 那你就得循环了。
【解决方案2】:

如果你对两行而不是一行没问题,你可以试试这个:

Dim cols As Variant

cols = Array(2,3,5,6,7,9,10,13,14,15,16)
ReDim Preserve cols(1 To UBound(cols) + 1)

【讨论】:

    【解决方案3】:

    @Rory 有正确的答案,但我们可以让代码在视觉上看起来像这样:

    Dim cols(): cols = [{2,3,5,6,7,9,10,13,14,15,16}]
    

    【讨论】:

      【解决方案4】:

      您可以评估 row() 函数,而不是重复每个数字(如果您尚未处理 2019/365 版本中可用的 SEQUENCE() 函数 *):

      Dim cols: cols = Application.Transpose(Evaluate("row(2:16)"))
      ' cosmetic
      ReDim Preserve cols(0 To UBound(cols) - 1)
      

      注意:仅当您想获得一个基于零的 1-dim 数组时才进行 ReDim。

      MS Excel 365 版本提示 *) 动态SEQUENCE() 函数可以作为公式立即应用到垂直区域的顶部,例如=SEQUENCE(15;1;2);集成到 VBA 代码中以获得“平面”一维数组将导致

      Dim cols: cols = Application.Transpose(Evaluate("SEQUENCE(15;1;2)"))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-01
        • 2012-04-24
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 2022-08-09
        • 1970-01-01
        相关资源
        最近更新 更多