自定义Excel VBA公式生成#VALUE! 只有在自动计算

我有一个涉及2个自定义函数/公式的复杂公式的单元格“A”。

我明白当单元格更改值时,Excel会自动重新计算其所有依赖单元格。 当单元格“A”从这个机制得到更新时,它给出#VALUE !.

不做任何事情,我select单元格“A”>按F2(编辑)>然后按enter(退出编辑),单元格的值“A”重新计算并给出正确的值。

编辑1 :超出这些键盘快捷键只有CTRL + ALT + SHIFT + F9给出正确的值。 所有其他人给#VALUE! 如果该函数没有Application.Volatile

公式:

 =HLOOKUPRANGE(arr(CB43,CC43,CE43),Q!$CD$3:$DG$28,CG43) 

有问题的VBAfunction:

 Public Function arr(ParamArray fields() As Variant) arr = fields End Function Public Function HLOOKUPRANGE(headers() As Variant, lookup_range As Range, row_index As Integer) As Variant If lookup_range.Columns.Count = 1 Then HLOOKUPRANGE = lookup_range(row_index, 1) Else ' look at the first row in the range for the header For colStart = 1 To lookup_range.Columns.Count Step 1 col = lookup_range.Cells(1, colStart).Value If col = headers(1) Then colEnd = colStart + lookup_range.Cells(1, colStart).MergeArea.Columns.Count - 1 Exit For End If Next ' set the new smaller range First = lookup_range.Cells(2, colStart).Address Last = lookup_range.Cells(lookup_range.Rows.Count, colEnd).Address Dim szRange As String szRange = First & ":" & Last ' set the new headers array Dim header_next() As Variant If UBound(headers) > 1 Then ReDim header_next(1 To UBound(headers) - 1) For i = LBound(headers) + 1 To UBound(headers) Step 1 header_next(i - 1) = headers(i) Next End If HLOOKUPRANGE = HLOOKUPRANGE(header_next, Range(szRange), row_index) End If End Function 

这些函数的组合工作是以自顶向下的方式从头中导航查找表,并根据arr()中定义的string头在表中返回一个值。

编辑1 :检查计算步骤时,arr()正确地评估为HLOOKRANGE({“hdr1”,“hdr2”,“hdr3”},Q!$ CD $ 3:$ DG $ 28,CG43)值!

看起来Range()函数被调用时,具有Application.ActiveSheet范围,而不是包含相同函数的单元格公式的Worksheet范围。

因此,为了解决我的问题,我需要从正确的工作表中显式调用Range(),例如

 Dim rangeWorksheet as String rangeWorksheet = lookup_range.Cells(2, colStart).Parent.Name Dim curws As Worksheet Set curws = Worksheets(rangeWorksheet) curws.Range(...)