VBA:在Excel中创建会话持久对象(哈希)

时间:2012-02-29 09:47:34

标签: excel session vba hash persistence

是否可以在VBA函数(UDF)中创建具有全局范围的对象? I.e持续超出函数的运行时间?我想把它放在一个带有唯一键的哈希中,我可以传递给其他函数。我知道你可以在c#/ c ++ dll中做到这一点。

动机是一项重要的处理工作,我不想在数百个函数调用中重复:我想缓存结果,所以我只需要做一次。例如,我想我有一个在Cell A1中构建结果对象的UDF:

=CreateResultsObject(arg1, arg2, arg3...)

该函数执行繁重的工作并返回唯一的ID字符串(存储在持久散列中的对象的键)。单元格A1现在包含此字符串值,然后我可以将其传递给其他函数:然后,他们可以使用密钥访问哈希中的缓存对象。

这可能吗?如果是这样的话?

2 个答案:

答案 0 :(得分:7)

您在模块中声明的变量是持久的。

模块中的此代码可能会转到您想要的方向:

Option Explicit

Dim col As New Collection


Public Function GetValue(ByVal strName As String) As String

    GetValue = col.Item(strName)

End Function

Public Sub SetValue(ByVal strName As String, ByVal strValue As String)

    col.Add strValue, strName

End Sub

注意:

对于重复或缺少的名称,代码将失败。 可以通过相应地修改函数签名来传递任何类型的对象,而不是字符串值。

<强>附录:

具有更多智能的相同代码 - 对于集合中的现有密钥,将替换该值而不是失败并显示错误。

Option Explicit

Dim col As New Collection


Public Function GetValue(ByVal strName As String) As String

    GetValue = col.Item(strName)

End Function

Public Sub SetValue(ByVal strName As String, ByVal strValue As String)

    If HasValue(strName) Then
        col.Remove (strName)
    End If

    col.Add strValue, strName

End Sub

Private Function HasValue(ByVal strName As String) As Boolean

    Dim val As Variant
    Dim bRes As Boolean

    bRes = True

On Error Resume Next

    val = col.Item(strName)

    If Err.Number <> 0 Then
        bRes = False
        Err.Clear
    End If
On Error GoTo 0

    HasValue = bRes

End Function

答案 1 :(得分:2)

如何在模块中使用全局变量?

这样的事情:

Option Explicit
Dim sHash As String

Function CreateResultsObject()
    'very long code
    sHash = "MyTest"
    CreateResultsObject = "ok"
End Function

Function displayresultsobject()
    displayresultsobject = sHash
End Function

请注意,只有在工作表中调用CreateResultsObject()并且每次要求重新计算时,才会重新计算哈希值。