Excel VBA:答案被“卡住”

时间:2010-09-01 21:03:46

标签: excel vba

我是Excel 2003中的VBA新手。我编写了一个UDF,它接受两个字符串:一个过滤器和一个将成为单元格引用的过滤器。当我调试并在VBA编辑器中连续几次调用该函数时,一切都按预期工作。但是当我在电子表格中多次使用UDF时,尽管存在不同的输入,但所有用途都显示完全相同的答案。

功能如下。它更新数据透视表,然后将值复制出单元格。但我必须滥用它:

Function UpdatePivotAndFetchCell(catcode As String, theCell As String) As Variant
Dim ws, pt, catField, pi, theval, finalVal
Set ws = Worksheets("Reporting")
Set pt = ws.PivotTables("MyReport")
pt.RefreshTable
Set catField = pt.PivotFields("Category")

For Each pi In catField.PivotItems
    If InStr(pi.Value, catcode) Then
        pt.PivotFields("Category").CurrentPage = pi.Value
        theval = ws.Range(theCell).Value
        On Error Resume Next
        If (TypeName(theval) <> "Error") Then
            finalVal = theval
        End If
        Exit For
    End If
Next pi
UpdatePivotAndFetchCell = finalVal
End Function

如果我使用VBA编辑器运行它,我会得到:

Debug.Print (UpdatePivotAndFetchCell("C001", "K284"))
    'Returns 0.48
Debug.Print (UpdatePivotAndFetchCell("C002", "K284"))
    'Returns 0.52

但在工作表中:

=UpdatePivotAndFetchCell("C001", "K284")
    (displays 0.52)
=UpdatePivotAndFetchCell("C002", "K284")
    (displays 0.52)

我可能没有正确指定功能吗?这对我来说是一个谜。

1 个答案:

答案 0 :(得分:4)

从工作表调用的函数是not allowed to change sheets。否则,您可以在计算树中轻松创建无限循环。因此,忽略更改工作表的所有内容(例如RefreshTable().CurrentPage =)并导致该函数停止。

为了完整起见,有一个workaround,但你不应该使用它,如果你这样做,你可以run into problems