1

作为 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
4

1 回答 1

1

据我所知,非常好看的课程(尽管您的 VBA 课程构建技能显然比我的高级)。我可能建议的是,如果您精通 .NET,则在 Visual Studio 中将其重新创建为可移植类库,以便您可以利用 .NET 框架的强大功能。

  1. 在 Visual Studio 中创建一个新的“类库”。
  2. 导入System, 并System.Runtime.InteropServices进入您的新课程。
  3. 将类包装在命名空间中。
  4. 为您的属性、方法等创建一个接口。
  5. 转到“编译”设置,然后单击“注册 COM 互操作”。
  6. 构建项目——这会在项目的 BIN 文件夹中创建一个 .TLB 文件。
  7. 在 VBA 开发人员环境中添加 .TLB 文件作为参考。

这是 VB.net 代码的示例:

Option Strict On
Imports System
Imports System.Runtime.InteropServices
Namespace SuperDictionary
    ' Interface with members of the Super-Dictionary library exposed in the TLB.
    Public Interface ISuperDictionaryInterface
        ReadOnly Property MyListOfTypeStringProperty(ByVal index As Integer) As String
        Function MyMethod(ByVal someValue as Variant) as Boolean
    End Interface

    <ClassInterface(ClassInterfaceType.None)>
    Public Class SuperDictionary: Implements ISuperDictionaryInterface

        Public Function MyMethod(ByVal someValue as Variant) As Boolean Implements ISuperDictionaryInterface.MyMethod
        '========================
        'Your code here
        '========================
        End Function

        Private _MyListOfTypeStringProperty As List(Of String)
        Public ReadOnly Property MyListOfTypeStringProperty(ByVal index as Integer) As String Implements ISuperDictionaryInterface.MyListOfTypeStringProperty
            Get
                Return _MyListOfTypeString(index)
            End Get
        End Property

    End Class
End Namespace

VBA 不能用 .NET 做什么?

这是一个很好的问题,我很高兴你问。显然,您可以做的比我在这里演示的要多得多。举个例子,假设您想集成一些现在所有酷孩子都在使用的花哨的新Web 服务。无论您是使用 WSDL 文件与 Web 服务进行通信,还是您自己的自定义 REST 方法,.NET 框架的类与 Visual Studio 2012 开发人员环境中的大量工具相结合,使得使用 .NET 比 VBA 更可取. 使用上面概述的技术,您可以为这些 Web 服务创建一个包装类,该类使用自定义方法来执行所有必要的操作,然后将 VBA 兼容的对象和/或数据类型返回给 VBA。好多了,不是吗?

更不用说,您创建的库还可以与其他平台兼容,例如 ASP.NET、Windows Phones、Silverlight、Xbox 等。


我使用了一些有用的链接(我会在找到它们时添加更多链接):

于 2014-04-21T20:05:40.490 回答