繁体   English   中英

您可以使用单元内 Excel 公式访问 VBA 列表吗?

[英]Can you access a VBA list with an in-cell Excel formula?

我写了一个 VBA 脚本/宏,当在特定范围 (nxm) 的单元格中检测到变化时运行。 然后,它会根据在第一个范围内检测到的内容更改另一个范围 (nx 1) 中的值。

这一点工作得很好......但随之而来的是古老的擦除撤消堆栈问题。 不幸的是,用户需要能够撤消他们最后约 10 次左右的操作。

我的理解是,仅当 VBA 直接编辑工作表上的某些内容时,撤消堆栈才会被清除 - 但如果 VBA 只是在后面运行而不编辑工作表,它就会被保留。

所以我的问题是:是否可以使用单元格公式(如下所示)从 VBA 数组中提取值?

'sample of in-cell function in cell A3
=function_to_get_value_from_vba_array(vba_array, index_of_desired_value)

本质上,VBA 将存储一个一维字符串数组,其中包含范围所需的值。 通过使用公式从数组中获取值:我也许能够解决撤消堆栈被擦除的问题。

谢谢!

解决方案
您需要执行以下操作:您对 function 的参数应该调用数组 bulding; 我创建了一个虚拟 function 来创建一些示例 arrays 来演示它。 在您的情况下,您可能需要将工作表事件的更改存储在全局数组变量中,并且正如您所说,在工作表上什么也不做(每当发生更改时,只需根据需要重新调整或附加到全局数组中)。 但是,可能会出现一个新问题,即当您关闭/重新打开时,或者由于某种原因数组丢失,因此您需要跟踪它,我建议在关闭事件之前捕获,然后将公式转换为 static 值.

Function vba_array(TxtCase As String)
Dim ArrDummy(1) As Variant
Select Case TxtCase
Case "Txt": ArrDummy(0) = "Hi": ArrDummy(1) = "Hey"
Case "Long": ArrDummy(0) = 0: ArrDummy(1) = 1
Case "Boolean": ArrDummy(0) = True: ArrDummy(1) = False
End Select
vba_array = ArrDummy
End Function

在您调用 function 时,请执行以下操作

Function get_value_from_vba_array(vba_array() As Variant, index_of_desired_value As Long) As Variant
'when parsing, even with option base 0 it starts at 1, so we need to add 1 up
get_value_from_vba_array = vba_array(index_of_desired_value + 1)
End Function

在你的书中,你的公式应该是这样的:

=get_value_from_vba_array(vba_array("Txt"),1)

演示
我之前做过一些动作,所以你可以看到“撤消”有效

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM