2010-12-12 53 views
0

我在Excel中使用vba和访问数据库。访问数据库是一个包含3列的表; OrderIDs是一列数字,表示特定项目的顺序,OrderDescription是包含项目描述的列,Item#是对每个特定项目给出数字的列(如果项目是与另一个相同,它们都是相同的项目)。连接到数据库的VBA二维数组

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

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

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

我的问题是我该如何设置这个数组?我尝试了一个循环,它会将订单号的值分配给一个数组,然后将这些项的数字分配给一个数组,然后将数组的大小标注为这些大小,但它不会工作。

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

感谢您的帮助

回答

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 #] 

随着含有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 

+0

请问该返回元件,使得orderItemArray(1,24)=真,如果第24项是在订单编号1? – 2010-12-13 00:22:43

+0

我承认存在一个问题,那就是如果有缺失的物品,上面就会遗漏那个物品。但是,这很容易用项目编号表进行纠正。 – Fionnuala 2010-12-13 00:31:29

+0

真棒我会试试看,谢谢。下一步是将该数组转换为一个同时出现的矩阵,将项目编号作为行和项目编号读取为列,并将两件事物一起进行比较。抱歉不断问,但你知道制定策略吗? – 2010-12-13 00:55:02