【问题标题】:Excel VBA: Answer gets "stuck"Excel VBA:答案“卡住”
【发布时间】:2011-04-07 00:48:27
【问题描述】:

我是 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)

也许我没有正确指定函数?这对我来说是个谜。

【问题讨论】:

  • 您可以发布一个示例电子表格吗?也许作为 Dropbox 上的公共文档?另外,您是否尝试过在函数中设置断点并单步执行代码?
  • 你检查过编写 UDF 的限制吗?我记得除了当前单元格之外,您不能更改任何内容,否则结果会不稳定。见ozgrid.com/VBA/Functions.htm
  • 与您的问题无关,但请注意,如果您 DIM 变量但未设置类型,则 VBA 会将其默认为变体。

标签: excel vba


【解决方案1】:

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

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

【讨论】:

  • 啊哈。你会建议什么作为替代方案?谢谢!
  • 哦,也许我可以做一个改变子的东西,然后把结果放到某个单元格并从那里抓取它?我去试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多