VB Excel使用表中的列作为数组

时间:2014-08-06 00:58:15

标签: excel vb.net excel-vba vba

我对VB脚本很陌生,所以我可能错过了很简单的东西。

我有一个excel电子表格,其中两张不同的表格上有两个表格,我正在尝试将结果作为文本加入到另一个表格中。

我正在使用以下示例VB,导致下标超出范围错误。

Sub ColCars_with_table()

Dim myTableCars As ListObject
Dim myTableColours As ListObject
Dim carAlias As Variant
Dim colourAlias As Variant
Dim x As Long
Dim y As Long

Set myTableCars = Sheets("Cars").ListObjects("CarTable")
Set myTableColours = Sheets("Colours").ListObjects("ColourTable")

carAlias = myTableCars.ListColumns(1).DataBodyRange
colourAlias = myTableColours.ListColumns(1).DataBodyRange

For x = LBound(carAlias) To UBound(carAlias)
    For y = LBound(colourAlias) To UBound(colourAlias)
        MsgBox ("Colour and make is " & colourAlias(y) & " " & carAlias(x))
    Next y
Next x

如果我将VB转换为直接数组,我可以让它工作:

Sub ColCars_without_table()
'this works
carAlias = Array("Subaru", "Toyata", "Ferrari", "Volkswagen", "Audi", "BMW", "Fiat", "Mazda")
colourAlias = Array("Red", "Blue", "Yellow")

For x = LBound(carAlias) To UBound(carAlias)
    For y = LBound(colourAlias) To UBound(colourAlias)
        MsgBox ("This is a " & colourAlias(y) & carAlias(x)) 'this will produce the correct results
    Next y
Next x

End Sub

我可能在从表格中获取数据的方式做了一些根本性的错误,希望有人能够引导我朝着正确的方向前进。

2 个答案:

答案 0 :(得分:-1)

我建议使用named range来定义颜色和汽车,然后通过命名范围在VBA中填充变体数组。

使用此方法的第一步是导航到功能区中的Formulas -> Name Managercreate two named ranges,一个用于您的汽车,另一个用于您的颜色。

一旦定义了命名范围,您就可以在下面的代码中引用它们

Sub ColCars_without_table()

Dim carArray() As Variant
Dim colorArray() As Variant

carArray = Range("Cars")        'Populates variant array with values from Cars Named Range
colorArray = Range("Colors")    'Populates variant array with values from Colors Named Range

For x = LBound(carArray, 1) To UBound(carArray, 1)
    For y = LBound(colorArray, 1) To UBound(colorArray, 1)
        MsgBox ("This is a " & colorArray(y, 1) & carArray(x, 1))
    Next y
Next x

End Sub

答案 1 :(得分:-1)

  

我可能正在从表格中获取数据的方式做出根本性的错误

不,但我认为你在如何迭代你的范围数组方面做错了。范围数组始终二维,即使它是单列或单行的范围。如果是单列,请执行以下操作:

carAlias = Application.Transpose(myTableCars.ListColumns(1).DataBodyRange)

如果范围是,则必须对其进行双转置,即:

Dim headerRow as Variant
headerRow = Application.Transpose(Application.Transpose(myTableCars.HeaderRowRange))

然后你将得到一个不会引起SOOR错误的一维数组。

在这种情况下,SOOR错误会引发,因为你已经在数组中要求一个元素而没有指定这两个维度。