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

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

我有一个Excel电子表格,其中有两个不同的工作表上的两个表,并试图join结果作为文本反馈到不同的表。

我正在使用下面的示例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转换为直线arrays,我可以使它工作:

 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 

我可能正在做一些根本性的错误,就是我从表格中获取数据的方式,希望有人能够把我引向正确的方向。

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

使用这种方法的第一步将导航到function区中的Formulas -> Name Manager ,并创build两个命名范围 ,一个用于您的汽车,另一个用于您的颜色。

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

 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 

我可能会从我从表格中获取数据的方式做一些根本性的错误

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

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

如果范围是一行 ,那么你必须双转置它,即:

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

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

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