作为 vba 中字典的重度用户,我发现创建一个“超级字典”类很有用,它可以处理许多我不想处理主要代码的小问题。下面是这个“超级字典”自定义对象的草稿。
这是一个好主意吗?这种方法会以某种不可预见的方式影响我的字典的性能吗?(例如我的Get Item
方法很贵吗? - 我经常使用它)
提前谢谢!
Public pDictionary As Object
Private Sub Class_Initialize()
Set pDictionary = CreateObject("Scripting.Dictionary")
End Sub
Private Sub Class_Terminate()
If Not pDictionary Is Nothing Then Set pDictionary = Nothing
End Sub
Public Property Get GetItem(Key As Variant) As Variant:
If VarType(pDictionary.Items()(1)) = vbObject Then
Set GetItem = pDictionary(Key)
Else
GetItem = pDictionary(Key)
End If
End Property
Public Property Get GetItems() As Variant:
Dim tmpArray() As Variant, i As Integer
If Not pDictionary.Count = 0 Then
ReDim tmpArray(pDictionary.Count - 1)
For i = 0 To pDictionary.Count - 1
If VarType(pDictionary.Items()(i)) = vbObject Then Set tmpArray(i) =pDictionary.Items()(i)
If Not VarType(pDictionary.Items()(i)) = vbObject Then tmpArray(i) =pDictionary.Items()(i)
Next i
Else
ReDim tmpArray(0)
End If
GetItems = tmpArray
End Property
Public Property Get GetKeys() As Variant:
GetKeys = pDictionary.Keys
End Property
Public Property Get Count() As Integer:
Count = pDictionary.Count
End Property
Public Property Get Exists(Key As Variant) As Boolean:
If IsNumeric(Key) Then Exists = pDictionary.Exists(CLng(Key))
If Not IsNumeric(Key) Then Exists = pDictionary.Exists(Key)
End Property
Public Sub Add(Key As Variant, Item As Variant):
If IsNumeric(Key) Then pDictionary.Add CLng(Key), Item
If Not IsNumeric(Key) Then pDictionary.Add Key, Item
End Sub
Public Sub AddorSkip(Key As Variant, Item As Variant):
If IsNumeric(Key) Then
If Not pDictionary.Exists(CLng(Key)) Then pDictionary.Add CLng(Key), Item
Else
If Not pDictionary.Exists(Key) Then pDictionary.Add Key, Item
End If
End Sub
Public Sub AddorError(Key As Variant, Item As Variant):
If IsNumeric(Key) Then
If Not pDictionary.Exists(CLng(Key)) Then
pDictionary.Add CLng(Key), Item
Else
MsgBox ("Double entry in Dictionary: " & Key & " already exists."): End
End If
Else
If Not pDictionary.Exists(Key) Then
pDictionary.Add Key, Item
Else
MsgBox ("Double entry in Dictionary: " & Key & " already exists"): End
End If
End If
End Sub
Public Sub Remove(Key As Variant):
If IsNumeric(Key) Then
pDictionary.Remove (CLng(Key))
Else
pDictionary.Remove (Key)
End If
End Sub