2015-05-29 22 views
1

我正在嘗試編寫一個簡單的UDF,它應該循環遍歷給定行的每個單元格,並挑選那些沒有任何先例範圍的單元格,並添加提高價值。VBA UDF無法調用Range.Precedents屬性

下面是代碼:

Public Function TotalActualDeductions(given_row As Integer) As Integer 

Total_Actual_Deduction = 0 

For present_column = 4 To 153 

    Set precedent_range = Nothing 

    If Cells(2, present_column) = "TDS (Replace computed figure when actually deducted)" Then 

     On Error Resume Next 

     Set precedent_range = Cells(given_row, present_column).Precedents 

     If precedent_range Is Nothing Then 

      Total_Actual_Deduction = Total_Actual_Deduction + Cells(given_row, present_column) 

     End If 

    End If 

Next 

TotalActualDeductions = Total_Actual_Deduction 

End Function 

如果我試圖通過修改上面的聲明,從運行它:

Public Function TotalActualDeductions(given_row As Integer) As Integer 

到:

Public Function TotalActualDeductions() 
given_row = 4 

那麼它成功運行和預期的一樣。它精確地挑選符合標準的單元格,並且都很好。

但是,當我嘗試從工作表中運行它作爲正確的UDF時,它不起作用。顯然,當我從工作表中調用函數時,excel會將那些沒有先例的單元視爲先例。

我不知道爲什麼會發生這種情況,或者如果range.precedents屬性的行爲應該如此。

這怎麼解決?

+2

從編程工具包中放棄'在錯誤恢復下一個'。只有很少的時候,它是處理某種事物的唯一方式,幾乎不會是最好的方式。你對這個陳述所做的一切就是掃描你的代碼在地毯下產生的任何錯誤,並假裝沒有錯。隨着那條線,你永遠不會發現問題。刪除它,讓錯誤拋出,看看發生了什麼。 – FreeMan

+0

我已經故意說了。你看,如果單元格確實沒有任何先例,那麼「設置precedent_range = Cells(given_row,present_column).Precedents」會引發錯誤,並且它永遠不會進入「If-Then」條件。 –

+1

這就是問題所在。你設置了OERN,但你永遠不會取消它 - 這就是爲什麼它使用這麼糟糕的原因之一 - 經常發生這種情況。之後的某個地方發生了一個錯誤,但是你已經把它掃到地毯下了。在這種情況下,你不需要它,因爲你的'Set Precedent_range'後面跟着'if precedent_range是Nothing ...' - 你已經正確地處理了這個錯誤。擺脫OERN並找出真正的錯誤。 – FreeMan

回答

0

很多搜​​索後,我遇到這樣的:

When called from an Excel VBA UDF, Range.Precedents returns the range and not its precedents. Is there a workaround?

顯然,「在包括UDF調用堆棧,以.Precedents任何呼叫被differntly處理」。

所以,我所做的就是利用Range.Formula像 「= [A-ZA-Z]」,因爲它滿足了我的目的很簡單。它絕不是range.precedents屬性的理想替代方案。

敵人更詳細的解釋,請訪問該鏈接。