VBA:Dictionary - 只能检索最后一个条目

时间:2013-05-08 06:56:10

标签: class vba excel-vba dictionary storage

这可能是一个新手的错误,我不知道一些我没有改变的设置。无论如何,我正在尝试使用Dictionary来存储我创建的类的实例。

班级cls_Connote只是一个细节容器。

Public connoteNumber As String
Public despatchDate As Date
Public carrier As String
Public service As String
Public items As Integer
Public weight As Integer
Public cost As Single
Public surchargeType As String

以下是我将详细信息存储到类中然后存入字典的方法。

Function getSurcharge_tag(givenTag As String, givenCol As String, ByRef dicStore As Dictionary, ByRef counter As Integer)`

Dim tagLen As Integer
Dim conNum, conTag As String

Dim clsSurchargeDetails As New cls_Connote
Dim despatchDate, carrier As String
Dim items, weight As Integer
Dim cost As Single


Range(givenCol).Select

tagLen = Len(givenTag)

Do While (ActiveCell.Value <> "")
    conNum = Mid(ActiveCell.Value, 1, Len(ActiveCell.Value) - 1)
    conTag = Mid(ActiveCell.Value, Len(ActiveCell.Value) - tagLen + 1, Len(ActiveCell.Value))

    If (conTag = givenTag) Then 'Remove: both the Original and Adjusted connote lines

        despatchDate = ActiveCell.Offset(0, -2).Value
        items = ActiveCell.Offset(0, 10).Value
        weight = ActiveCell.Offset(0, 11).Value
        cost = ActiveCell.Offset(0, 12).Value

        clsSurchargeDetails.connoteNumber = conNum
        clsSurchargeDetails.despatchDate = despatchDate
        clsSurchargeDetails.carrier = carrier
        clsSurchargeDetails.items = items
        clsSurchargeDetails.weight = weight
        clsSurchargeDetails.cost = cost
        clsSurchargeDetails.surchargeType = givenTag

        dicStore.Add conNum, clsSurchargeDetails
        givenCtr = givenCtr + 1

        ActiveCell.EntireRow.Delete
    Else
        ActiveCell.Offset(1, 0).Select
    End If
Loop
End Function

这就是我试图从字典中获取含义的方法。

Function displaySurcharges(wrkShtName As String, ByRef dicList As Dictionary)

'Remove the existing worksheet
Dim wrkSht As Worksheet
On Error Resume Next
    Set wrkSht = Sheets(wrkShtName)
On Error GoTo 0
If Not wrkSht Is Nothing Then
    Worksheets(wrkShtName).Delete
End If

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = wrkShtName

populateColumnHeaders

Range("A2").Select

Dim getCon As cls_Connote
Set getCon = New cls_Connote
Dim vPtr As Variant
Dim ptrDic As Integer

For Each vPtr In dicList.Keys

    Set getCon = dicList.Item(vPtr)

    ActiveCell.Value = getCon.connoteNumber
    ActiveCell.Offset(0, 1).Value = getCon.despatchDate
    ActiveCell.Offset(0, 2).Value = getCon.carrier
    ActiveCell.Offset(0, 12).Value = getCon.items
    ActiveCell.Offset(0, 13).Value = getCon.weight
    ActiveCell.Offset(0, 15).Value = getCon.cost
    ActiveCell.Offset(0, 16).Value = getCon.surchargeType

    Set getCon = Nothing
    ActiveCell.Offset(1, 0).Select
Next vPtr
End Function

我可以看到dicList确实包含不同的详细信息,getCon只获取字典中的最后一个条目。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:0)

为了避免在循环中重复使用和添加相同的引用,当您需要一个新实例(在If (conTag = givenTag)之后)时,只需要一个:

Set clsSurchargeDetails = New cls_Connote