我正在使用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(如果存在)?
感谢您的帮助
答案 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