连接到数据库的VBA二维数组

时间:2010-12-12 23:59:45

标签: arrays vba excel-vba multidimensional-array access-vba

我正在使用excel中的vba和访问中的数据库。访问数据库是一个包含3列的表; OrderIDs是一列数字,表示特定项目的订单,OrderDescription是包含项目描述的列,Item#是为每个特定项目提供编号的列(如果项目是与另一个相同,它们都是同一个项目。)

我需要在excel中使用VBA构建一个二维数组,其中包含哪些商品是在订单中购买的。行将是订单ID,列将是项目ID。此数组的元素将包含一个指示符(如True或“1”),表示此订单包含某些项目。例如,如果该订单购买了商品ID 1,5和26,则第6行(表示订单ID 6)将在第1,5和26列中具有“True”。该订单的所有其他列将为空白。

为了做到这一点,我想我必须确定最大订单号(39)和最大商品号(33)。我可以使用.connection和.recordset连接到的数据库中提供此信息。某些订单号和某些商品编号可能不会显示。

另请注意,这可能是一个稀疏数组(不是很多条目),因为大多数订单只包含几个项目。我们不关心客户购买的商品数量,只关注该商品是按此订单购买的。

我的问题是如何设置此阵列?我尝试了一个循环,它将订单号的值分配给一个数组,项目编号分配给一个数组,然后将数组的大小设置为那些大小,但它不会工作。

有没有办法让数组元素返回值为True(如果存在)?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

在我看来,最好的选择可能是在访问连接上运行的交叉表查询。您可以使用ADO方法GetRows创建数组:http://www.w3schools.com/ado/met_rs_getrows.asp

TRANSFORM Nz([Item #],0)>0 AS Val
SELECT OrderNo
FROM Table
GROUP BY OrderNo
PIVOT [Item #]

使用一个Counter表,其中包含1到最大列数(字段)Num的整数。

TRANSFORM First(q.Val) AS FirstOfVal
SELECT q.OrderNo
FROM (SELECT t.OrderNo, c.Num, Nz([Item #],0)>0 AS Val
FROM TableX t RIGHT JOIN [Counter] c ON t.[Item #] = c.Num
WHERE c.Num<12) q
GROUP BY q.OrderNo
PIVOT q.Num

输出:

OrderNo   1  2  3  4  5  6  7  8  9  10  11
                   0  0     0  0  0   0  
1        -1 -1          -1               -1
2        -1 -1 -1                        -1