了解如何使用字典

我有一张有一张客户发票数据的工作表:

Name | Date | OrderID | Item | Price | Email Anna | 2015-03-10 | ABC123 | Shirt | 5.00 | anna@gmail.com Bob | 2015-03-11 | ABC124 | Pants | 10.00 | bob@gmail.com Anna | 2015-03-11 | ABC125 | Pants | 10.00 | anna@gmail.com 

之前,我使用了一个从第2行到数据区域结束的for循环来添加到集合中。 我创build了两个类模块。 一个是“交易”,另一个是“发票”。 在“Transaction”类模块中,我为每个事务声明了组件的公共variables,即Name,Date,OrderID,Item,Price和Email。 “发票”类模块包含将每个事务添加到集合中的过程。

我开始将词典作为处理数据的一种方式,因为它能够使用键。 我希望密钥成为交易人的姓名。 因为安娜做了两笔交易,所以如果我在字典里查找“安娜”的钥匙,我就可以找回安娜的交易。

我怎么去做这个? 我一直在遇到错误,因为我一直在看的代码示例涉及一维数据集。

 Sub ProcessData() Dim dict As Dictionary Dim i As Integer Dim TargetRow As Integer Dim Name As String Dim Date As Date Dim OrderID As Double Dim Item As String Dim Price As Double Dim Email As string Dim More As Boolean Set dict = New Dictionary More = True i = 2 While more Name = Worksheets("Data").Cells(i, 1).Value Date = Worksheets("Data").Cells(i, 2).Value OrderID = Worksheets("Data").Cells(i, 3).Value Item = Worksheets("Data").Cells(i, 4).Value Price = Worksheets("Data").Cells(i, 5).Value Email = Worksheets("Data").Cells(i, 6).Value dict.Item(Name) = ... Wend End Sub 

要做到这一点,你需要传递一个数组作为你的Dictionary项目。
像这样的东西:

 Dim c As Range, sh As Worksheet, lr As Long, key Set sh = Worksheets("Data") With sh lr = .Range("A" & .Rows.Count).End(xlUp).Row End With With CreateObject("Scripting.Dictionary") ' Pass data from worksheet to Dictionary For Each c In sh.Range("A2:A" & lr) .Item(c.Offset(0, 2).Value2) = c.Resize(, 6) ' Passed as array Next ' Retrieve data from Dictionary to where For Each key In .Keys ' Access Items as array Debug.Print .Item(key)(1, 1) 'Name Debug.Print .Item(key)(1, 2) 'Date Debug.Print .Item(key)(1, 3) 'OrderID Debug.Print .Item(key)(1, 4) 'Item Debug.Print .Item(key)(1, 5) 'Price Debug.Print .Item(key)(1, 6) 'Email Next End With 

请注意,您需要使用始终唯一的Key
在你的示例数据中,你不能使用Name作为Key因为Ana有重复。
一旦你把它传递给字典,第一个数据将被覆盖。
在我上面的例子中,我使用OrderID作为Key,因为它是唯一的。
另外,我把所有的信息都作为一个二维数组Item并且可以像上面那样进行检索。
这没关系,但是我认为在你的情况下使用Class Module会更好。

您需要断开ADODB.Recordsets。 他们是一个网格。 字典只需要testing唯一的密钥。

这是一个两个字段的logging集。

 Sub Randomise Randomize Set rs = CreateObject("ADODB.Recordset") With rs .Fields.Append "RandomNumber", 4 .Fields.Append "Txt", 201, 5000 .Open Do Until Inp.AtEndOfStream .AddNew .Fields("RandomNumber").value = Rnd() * 10000 .Fields("Txt").value = Inp.readline .UpDate Loop .Sort = "RandomNumber" Do While not .EOF Outp.writeline .Fields("Txt").Value .MoveNext Loop End With End Sub '============================================= Sub Swap Dim LineCount Set rs = CreateObject("ADODB.Recordset") With rs .Fields.Append "LineNumber", 4 .Fields.Append "Txt", 201, 5000 .Open LineCount = 0 Do Until Inp.AtEndOfStream LineCount = LineCount + 1 .AddNew .Fields("LineNumber").value = LineCount .Fields("Txt").value = Inp.readline .UpDate Loop .Sort = "LineNumber DESC" Do While not .EOF Outp.writeline .Fields("Txt").Value .MoveNext Loop End With End Sub