Excel UDF计算应返回原始'值
我一直在努力解决VBA问题,我会尽可能彻底地解释它。
我用自己的RTD实现创建了一个VSTO插件,我从Excel工作表中调用它。为了避免在单元格中使用完整的RTD语法,我创建了一个从工作表中隐藏该API的UDF。
我创建的RTD服务器可以通过自定义功能区组件中的按钮启用和禁用。
我想要实现的行为如下:
如果服务器被禁用并且在单元格中输入了对我的功能的引用,我希望单元格显示
Disabled
如果服务器被禁用,但该功能在启用时已在单元格中输入(并且单元格因此显示一个值),我希望单元格继续显示该值
如果服务器已启用,我希望单元格显示Loading
听起来很容易。这是一个非功能性代码的例子:
Public Function RetrieveData(id as Long)
Dim result as String
// This returns either 'Disabled' or 'Loading'
result = Application.Worksheet.Function.RTD("SERVERNAME", "", id)
RetrieveData = result
If(result = "Disabled") Then
// Obviously, this recurses (and fails), so that's not an option
If(Not IsEmpty(Application.Caller.Value2)) Then
// So does this
RetrieveData = Application.Caller.Value2
End If
End If
End Function
该函数将在数千个单元格中调用,因此将“原始”值存储在另一个数据结构中将是一个主要的开销,我想避免它。此外,RTD服务器不知道这些值,因为它也不会出于同样的原因或多或少地保留它的历史记录。
我当时认为可能有某种方法退出该功能会迫使它不改变显示值,但到目前为止我一直无法找到类似的东西。
任何关于如何解决这个问题的想法都非常感谢!
谢谢,
车
编辑:
由于受欢迎的需求,我想要做所有这些的一些额外信息:
正如我所说,该函数将在数千个单元格中调用,RTD服务器需要检索相当多的信息。这在网络和CPU上都很难。为了允许用户自己决定他是否希望在他的机器上加载,他或她可以从服务器禁用更新。在这种情况下,他或她应该仍然能够使用当前字段中的值来计算工作表,但不会将更新推送到这些工作表中。一旦需要新数据,就可以启用服务器并更新字段。
再说一遍,因为我们在这里谈论的是相当多的数据,所以我宁愿不将它存储在工作表中的某个地方。此外,即使工作簿已关闭并再次加载,数据也应可用。
没有找到相关结果
已邀请:
3 个回复
舞备联
表现就像你在单元格中插入了注释函数,而不是RTD返回的值。换句话说,“结果”是“RTD-function-call”类型的对象,而不是RTD的答案。相反,这样做:
返回实际值,相当于在单元格中键入“3.1418”。这是一个重要的区别;在第一种情况下,细胞继续参与RTD喂食,在第二种情况下,它只是获得恒定值。这可能是您的解决方案。 2。 MS VSTO看起来好像写一个Office Addin是件小事......直到你真正尝试构建一个工业化,可分发的解决方案。获得安装程序的所有权限和权限是一场噩梦,如果您有支持多个版本的Excel的明智想法,它会成倍地变得更糟。我已经使用Addin Express多年了。它隐藏了所有这些MS的肮脏,让我专注于编码我的插件。他们的支持也是一流的,值得一看。 (不,我不是附属或类似的东西)。 3。 请注意,Excel可以并且将随时调用Connect / RefreshData / RTD,即使您处于某种状态 - 在幕后还会进行一些微妙的多任务处理。您需要使用适当的Synclock块来装饰代码以保护您的数据结构。 4。 当您收到数据(可能是在一个单独的线程上异步)时,您绝对必须在您最初调用的线程上回调Excel(通过Excel)。如果你不这样做,它会在一段时间内正常工作,然后你会开始得到神秘的,无法解决的崩溃,更糟糕的是,在后台使用孤立的Excel。以下是执行此操作的相关代码示例:
5。 我做了一些显然类似于你在这个插件中提出的问题。在那里,我异步地从Google获取地理编码数据,并使用由UDF遮蔽的RTD进行提供。由于对GoogleMaps的调用非常昂贵,我尝试了101种方式和几个月的晚上来保持单元格的价值,就像你正在尝试的那样,没有成功。我没有时间,但我的直觉是,像“Application.Caller.Value”这样的Excel调用比字典查找慢一个数量级。 最后,我创建了一个缓存组件,用于保存和重新加载已从我在Workbook OnSave中即时创建的非常隐藏的电子表格中获取的值。数据存储在Dictionary(of string,myQuery)中,每个myQuery都包含所有相关信息。 它运行良好,满足离线工作的要求,即使对于20'000 +公式,它也是瞬间出现的。 HTH。 编辑:出于好奇,我测试了我的预感,即调用Excel比进行字典查找要昂贵得多。事实证明,不仅预感正确,而且令人恐惧。
结果:
查找10'000元素字典中的值(整数,整数)比从Excel中获取单元格值快11'000倍。 证明完毕
物崎巩
戒黑恳农