【问题标题】:VBA arrays and variantsVBA 数组和变体
【发布时间】:2015-02-04 20:24:56
【问题描述】:

VBA 数组和变体数组让我很困惑!

如果我有一个二维数组,它本质上是电子表格上的一个范围,有没有办法设置一个等于二维数组中这些列之一的一维新数组?

这有意义吗?

编辑:

我有一个作为报价模板的电子表格。我引用的其中一些产品是我们不想引用的产品,因为它们不符合我们的指导方针。

我想浏览这些产品行,并通过检查产品是否有一个“踢”字段来确定哪些是坏的。如果是这样,那么我也将为该行(产品)创建其他字段。简单的宏。问题是我来自 Python 和 C,我倾向于将这些电子表格视为一堆一维数组,我通常会编写循环来遍历它们。

我过去所做的就是采用该范围,然后创建一堆一维数组,然后使用“for 循环”或“for each 循环”循环这些数组。这种方法效果很好,但是分配所有一维数组很痛苦。今天我想,也许有一种方法我只是用二维数组做同样的事情,因为很容易将整个范围快速分配为二维数组。

无论如何,我遇到的问题是我不知道如何仅引用二维数组的一维(col)。

我可以对二维数组的一列进行 for each 循环吗?

【问题讨论】:

  • 当你说本质上 - 实际上是一个范围还是一个数组?
  • 我一直在尝试使用实际范围,然后使用该范围的值来填充数组。我不确定哪种方法更适合我想做的事情。
  • 让我快速总结一下我正在尝试做的事情,因为也许我做错了。
  • 编辑了我的问题并添加了更多关于我在做什么的细节。

标签: vba excel


【解决方案1】:

范围对象在 Excel 中非常灵活。你可以通过多种方式做你想做的事。我举两个例子:

For i = 1 to 10
     b = Range("yourRange").Cells(i, yourColumn) + 1
 Next i

如果您为该列分配一个常量值,您可以轻松地循环遍历各行,如图所示。或者,如果您更喜欢 For Each 循环:

For each c in Range("yourRange").Columns(1)
     b = c + 1
Next

在任何情况下,VBA 都将每个 Excel 范围视为一个二维数组。您甚至可以使用普通的数组语法,例如:Range("yourRange")(row, col)

【讨论】:

  • 谢谢,我什至没有想过使用 .Columns 属性。这肯定会帮助我解决一些问题。我认为我的一些 VBA 问题来自于对范围数据类型的混淆。我的意思是什么是范围?我本来希望一个范围是单元格的集合,并且我可以以某种方式访问​​单个单元格,然后我可以在其上使用 TypeName() 来返回一种单元格类型。相反,我似乎仍然得到一种范围!它变得令人困惑!
  • @TimothyBramlett,在 Excel 中,单元格是一个范围。它只是一个二维数组,每个维度只有 1 个成员。它在 VBA 中非常灵活。可以使用Range("range").Cells(row,col)Range(x).Column(y).Cells(row,col)等。
  • 好的,那真的很有趣。所以,当我将某物声明为一个范围时,我并没有给它一个位置,我实际上是将它声明为一个单元格的集合,并且它具有单元格/范围的所有正常属性。看,我在想一个范围就像一个位置或地址,它引用了一组其他对象。
  • 我可以看出对于习惯于 C/C++ 或 Java 等复杂性的人来说,这将是多么令人困惑。如果您只需要这些值,您可以获得一个 Python 库来处理 excel 文件。
  • 嗯,C 在某些方面对我来说更精确。它通常不会做任何事情来帮助我,导致我不明白以后会发生什么。但话又说回来,用 C 进行开发需要很长时间。为此,Python 会很棒,但不幸的是,我需要 VBA,因为我正在构建一个实际上在 Excel 中的小型应用程序。不过,我可能只是遇到了这些问题,因为我在 VB/VBA 方面没有太多经验。我一直听说 VBA 是一场噩梦,但我发现在其中工作还不错! :)
【解决方案2】:

这说明了如何使用范围内的一维或二维数组

Sub GetCellDataInArrays()

    Dim rng As Range, a, a2, data, r, c

    Set rng = ActiveSheet.Range("A1:D12")

    'get a column: Transpose creates a 1-D array
    a = Application.Transpose(rng.Columns(2).Value)

    Debug.Print "Column 2: ", Join(a, ",")

    'get a row - note the double Transpose
    a2 = Application.Transpose(Application.Transpose( _
                 rng.Rows(3).Value))

    Debug.Print "Row 3:", Join(a2, ",")


    'EDIT: how to loop over a 2-D array obtained from a worksheet range
    data = rng.Value 'data is a 2-d 1-based array
    For r = 1 To UBound(data, 1)
        For c = 1 To UBound(data, 2)
            Debug.Print "Row " & r & ":Col " & c & " = ", data(r, c)
        Next c
    Next r

End Sub

【讨论】:

  • 教程的好例子(+1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2021-08-02
  • 1970-01-01
  • 2011-07-17
  • 2023-03-13
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多