VBA阵列和变体

VBA阵列和变体,vba,excel,Vba,Excel,VBA数组和变量数组让我很困惑 如果我有一个二维数组,它本质上是电子表格上的一个范围,那么有没有一种方法可以设置一个新的一维数组,它只等于二维数组中的一列 这有意义吗 编辑: 我有一个电子表格,这是一个报价模板。我引用的一些产品是我们不想引用的产品,因为它们不符合我们的指南 我想浏览这些产品行,通过检查产品是否有一个显示“kick”的字段来确定哪些产品是坏的。如果是的话,那么我也将为该行(产品)创建其他字段。简单宏。问题是,我来自Python和C,我倾向于将这些电子表格视为一组一维数组,我通常编

VBA数组和变量数组让我很困惑

如果我有一个二维数组,它本质上是电子表格上的一个范围,那么有没有一种方法可以设置一个新的一维数组,它只等于二维数组中的一列

这有意义吗

编辑:

我有一个电子表格,这是一个报价模板。我引用的一些产品是我们不想引用的产品,因为它们不符合我们的指南

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

我过去所做的就是在这个范围内创建一组一维数组,然后用“for-loop”或“for-each-loop”循环。这种方法工作得很好,但分配所有一维数组是一件痛苦的事情。今天我想,也许有一种方法,我只是做同样的事情,但是用一个二维数组,因为它很容易快速地将整个范围指定为一个二维数组

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


我可以在2D数组的一列上为每个循环执行一次循环吗?

这说明了从一个范围使用一维或二维数组

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

范围对象在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)

当你说本质上是一个范围还是一个数组?我一直在尝试使用一个实际的范围,然后使用该范围的值填充数组。我不确定哪种方法更适合我想做的事情。让我快速总结一下我想做的事情,因为我可能做得不对。编辑了我的问题并添加了更多关于我正在做的事情的细节。很好的教程示例(+1)谢谢,我甚至没有想到使用.Columns属性。这肯定会帮助我解决一些问题。我认为我的一些VBA问题源于对范围数据类型的混淆。我是说什么是射程?我希望一个范围是一个单元格集合,我可以以某种方式访问一个单元格,然后在它上使用TypeName()返回一种单元格类型。相反,我似乎仍然得到一个范围的类型!这让人困惑@TimothyBramlett,在Excel中,单元格是一个范围。它只是一个二维数组,每个维度只有一个成员。它在VBA中非常灵活。您可以使用
Range(“Range”).Cells(行,列)
Range(x)。Column(y)。Cells(行,列)
,等等。好的,那真的很有趣。所以,当我将某个东西声明为一个范围时,我并没有给它一个位置,我实际上是将它声明为一个单元格集合,它具有单元格/范围所具有的所有常规属性。看,我认为范围就像是一个指向其他对象组的位置或地址。我可以看出,对于习惯了C/C++或Java等复杂性的人来说,这是多么令人困惑。如果你只需要这些值,你可以使用Python库来处理excel文件。而且C在某些方面对我来说更精确。它通常不会帮我做一些事情,这会让我不明白接下来会发生什么。但是,用C语言开发需要花费很长时间。用Python进行开发是非常棒的,但不幸的是,我需要VBA,因为我正在构建一个用Excel编写的小应用程序。不过,我可能只是遇到了这些问题,因为我在VB/VBA方面没有太多经验。我总是听说VBA是一场噩梦,但我发现在其中工作并不太糟糕!:)