gpt4 book ai didi

excel - VBA:在 Excel 中创建 session 持久对象(哈希)

转载 作者:行者123 更新时间:2023-12-04 21:09:30 28 4
gpt4 key购买 nike

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

动机是我不想在数百个函数调用中重复的繁重处理:我想缓存结果,所以我只需要做一次。例如,假设我有一个 UDF,它在单元格 A1 中构建结果对象:

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

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

这可能吗?如果有怎么办?

最佳答案

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

模块中的此代码可能会朝着您想要的方向发展:

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

关于excel - VBA:在 Excel 中创建 session 持久对象(哈希),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9496810/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com