2010-09-01 115 views
1

我是Excel 2003中的VBA的新手。我寫了一個UDF,它包含兩個字符串:一個過濾器和一個將作爲單元格引用的UDF。當我在VBA編輯器中連續幾次調試函數並調用函數時,一切都按照我的預期工作。但是,當我在電子表格中多次使用UDF時,儘管存在不同的輸入,但所有用途都顯示完全相同的答案。Excel VBA:答案會「卡住」

該功能如下。它更新數據透視表,然後將該值複製到單元格外。但我必須誤用:

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) 

我不是指定功能正常,也許?這對我來說是個謎。

+0

您可以發佈示例電子表格嗎?也許作爲Dropbox上的公開文檔? 另外,你有沒有嘗試過在函數中設置一個斷點並逐步執行代碼? – bugtussle 2010-09-01 21:59:08

+0

您是否檢查了編寫UDF的限制?我記得你不能改變除當前細胞以外的任何物質,或者結果不穩定。請參閱http://www.ozgrid.com/VBA/Functions.htm – 2010-09-01 22:24:53

+0

與您的問題無關,但請注意,如果您DIM變量但未設置類型,則VBA將其默認爲一個變體。 – 2010-09-01 23:01:32

回答

4

從工作表中調用的函數不允許更改工作表。否則,您可以輕鬆地在計算樹中創建無限循環。因此,更改工作表的所有內容都會被忽略(如RefreshTable().CurrentPage =)。

+0

啊哈。你會建議作爲替代方案嗎? 謝謝! – Chris 2010-09-02 11:24:22

+1

哦,也許我可以做出改變一個子的東西,並把結果發送給某個單元並從那裏抓取它?我會去嘗試。 – Chris 2010-09-02 12:29:02