【问题标题】:Custom Excel VBA formula generates #VALUE! only on automatic calculate自定义 Excel VBA 公式生成 #VALUE!仅在自动计算时
【发布时间】:2012-04-26 08:45:09
【问题描述】:

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

我了解当单元格更改值时,Excel 会自动重新计算其所有相关单元格。当单元格“A”从此机制更新时,它会给出 #VALUE!。

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

编辑 1:在这些 keyboard shortcuts 中,只有 CTRL+ALT+SHIFT+F9 给出了正确的值。所有其他人都给#VALUE!如果函数没有Application.Volatile

公式:

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

有问题的 VBA 函数:

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() 中定义的字符串表头在表中返回一个值。

编辑 1:检查计算步骤时,arr() 正确计算为 HLOOKRANGE({"hdr1","hdr2","hdr3"},Q!$CD$3:$DG$28 ,CG43),但此结果的计算结果为 #VALUE!

【问题讨论】:

  • 如果在If lookup_range.Columns.Count = 1 Then 之前添加这行代码Application.Volatile 会发生什么?
  • @SiddharthRout 你明白了,但不完全。之前,F2 > 在单元格上输入仅更新具有正确值的单元格。添加 Application.Volatile 后,F2 > enter 使用 HLOOKRANGE 函数更新所有单元格并给出正确的值。自动更新仍然提供#VALUE!。
  • 尝试将Application.Volatile 放入这两个函数中,看看是否有帮助?
  • 刚试过。不,它不起作用。与我上次评论的行为相同。请再次查看我的帖子以获取更新的编辑。谢谢。

标签: excel vba


【解决方案1】:

似乎 Range() 函数在调用时具有Application.ActiveSheet 范围,而不是包含同一函数的单元格公式的工作表的范围。

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
相关资源
最近更新 更多