我编写了一个简单的VBA函数,用于在键/值对的长表中按键查找值。然后它将该值作为Double返回:
Public Function GetValue(sheet As String, key As String) As Double
Dim WS As Worksheet
Dim K As Range
GetValue = 0
Set WS = ThisWorkbook.Worksheets(sheet)
If WS Is Nothing Then Exit Function
Set K = FindKeyAnywhere(WS, key)
If K Is Nothing Then Exit Function
GetValue = WS.Cells(K.Row, 5).Value
End Function
我在摘要表中有大约60个这样的公式:
=GetValue("Data", B$41)
其中“数据”是包含键/值的页面名称,而B $ 41是键。一切都很完美,然后......
我胖了一下VBA,将= 0改为= o并且打了个电话。现在摘要中的每个单元格仍然说#VALUE
。当我意识到发生了什么时,我修复了错误并重新开始。但是,摘要中的每个单元格仍然说#VALUE
。
如果我点击单元格并点击返回,它就会更新。
我检查过,自动计算 已开启。我还点击了几次计算表。什么都没有。
所以我去了每个单元格并点击返回,所以它们都被更新了。现在他们没有说#VALUE
,但是当我在数据页面上更改数据时,它们仍然没有更新。
我有什么特别的遗失吗?似乎Excel被“卡住”认为计算无效。
更新
使用命名范围不能很好地工作,因为必须在每个公式中键入它。考虑...
KEY1 KEY2 ANOTHERKEY
Data1 =GetValue(A$1,B$1)
Data2
当用户CnP或拖动填充该公式时,它将自动获取密钥和表单。如果我们使用范围名称,他们必须在每个单元格中键入名称,并且有数百个。
有没有办法获取字符串并返回命名范围?与=Range(A1)
答案 0 :(得分:1)
正如John Coleman所说:Excel不知道当数据表上的某些内容发生变化时需要重新计算,因为UDF的先例不包括数据表中的范围信息。
你需要:
答案 1 :(得分:0)
根据您的更新,我认为您正在寻找INDIRECT,它可以将字符串转换为范围。
但INDIRECT有一些主要的缺点:它的易失性,单线程并且在用户提供的字符串不存在时表现不佳。
恕我直言,这不是一个好的方向:我建议你考虑重新设计你的数据/算法。