是否可以在VBA函数(UDF)中创建具有全局范围的对象? I.e持续超出函数的运行时间?我想把它放在一个带有唯一键的哈希中,我可以传递给其他函数。我知道你可以在c#/ c ++ dll中做到这一点。
动机是一项重要的处理工作,我不想在数百个函数调用中重复:我想缓存结果,所以我只需要做一次。例如,我想我有一个在Cell A1中构建结果对象的UDF:
=CreateResultsObject(arg1, arg2, arg3...)
该函数执行繁重的工作并返回唯一的ID字符串(存储在持久散列中的对象的键)。单元格A1现在包含此字符串值,然后我可以将其传递给其他函数:然后,他们可以使用密钥访问哈希中的缓存对象。
这可能吗?如果是这样的话?
答案 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()
并且每次要求重新计算时,才会重新计算哈希值。