2011-08-18 71 views
0

我執行一個VBA代碼,它接收一個數據庫,對其進行處理並將其導出到工作表中。這工作正常。但是,我有一張根據特定工作表中的數據生成圖表的工作表。數據沒有實現。我必須進入單元格並點擊進入以實現它。我很確定有一個更簡單的方法來做到這一點。計算設置爲自動,但似乎沒有改變任何東西。沒有實現的函數

在我的單元格中,我有我自己的vba函數,需要在報表完成後更新。當我點擊單元格然後輸入時,結果會被更新,但我希望能夠自動完成。我希望這更清楚!

由於提前,

艾蒂安NOEL

這是我的函數的代碼

Public Function number_of_appearances(term As String, sheet As String, column As Integer) As Integer 


Application.Volatile 
    Dim number_of_rows As Integer 
    Dim appearances As Integer 
    Dim row As Integer 

    appearances = 0 
    row = 1 
    number_of_rows = Worksheets(sheet).UsedRange.Rows.Count 

    Do While row <= number_of_rows 
     If Worksheets(sheet).Cells(row, column).Value = term Then 
      appearances = appearances + 1 
     End If 
     row = row + 1 
    Loop 


    number_of_appearances = appearances 

End Function 

功能

=number_of_appearances('test';'sheet1'; 3) 
的用戶的細胞例如
+0

目前還不清楚到底是什麼「具體化」的手段在這個問題上。你有沒有計算的公式?在這種情況下你有沒有試過調用Application.CalculateFull? –

+0

是的,我試過了。我更新了該帖子的更多細節。 – CoachNono

+0

您是否有機會使用'Worksheet_Change'事件來調用「需要更新報表完成後」的VBA函數?這可能是一個問題,如果您希望觸發事件的單元格具有一個只能引用其他工作表上的單元格的公式(對公式引用的單元格值的更改會觸發「計算」事件但不會觸發「更改」事件觸發單元所在的工作表)。這不是最可能發生的情況,所以請詳細解釋你如何調用你的函數。 – barrowc

回答

3

聽起來像你的UDF可能不依賴於任何處理數據庫時更改值的單元格。
This MSDN Link

安置自己的UDF(或只是它的頭,如果你喜歡),並使用它的一個例子...

編輯:
是,沒有一個參數的UDF的單元格引用,因此UDF在觸發數據改變時不會被觸發重新計算。

你有兩個選擇:
1.重寫你的UDF,包括參數(S)時,DB處理 2.讓你的UDF volitile這種變化值參考單元(包括Application.Volatile在UDF代碼)警告:這可能是非常低效的,這取決於有多少時間使用UDF以及如何強化它的計算是

編輯2:
使用繼承人提到的第一個選擇你的UDF的重構:

Public Function number_of_appearances(term As String, rng As Range) As Integer 
    Dim v As Variant 
    Dim i As Long, j As Long 
    Dim appearances As Long 

    v = Intersect(rng, rng.Worksheet.UsedRange) 
    For j = LBound(v, 2) To UBound(v, 2) 
    For i = LBound(v, 1) To UBound(v, 1) 
     If v(i, j) = term Then 
      appearances = appearances + 1 
     End If 
    Next i, j 
    number_of_appearances = appearances 

End Function 

使用像 =number_of_appearances("test";Sheet1!C:C)

編輯3:
如果你正在做的是統計範圍內的字符串occurances的數量,可以考慮使用
=COUNTIF(Sheet1!C:C;"test")

+0

公共函數number_of_appearances(term As String,sheet As String,As As Integer)As Integer = number_of_appearances('test','Sheet1',2) – CoachNono

+0

感謝您的回答,但是,application.volatile不會更改單元格內的值。奇怪是不是?你有線索嗎? – CoachNono

+0

將需要更多的信息.​​..你可以發佈你的UDF代碼和使用它的工作表片段嗎? –