我正在嘗試編寫一個簡單的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屬性的行爲應該如此。
這怎麼解決?
從編程工具包中放棄'在錯誤恢復下一個'。只有很少的時候,它是處理某種事物的唯一方式,幾乎不會是最好的方式。你對這個陳述所做的一切就是掃描你的代碼在地毯下產生的任何錯誤,並假裝沒有錯。隨着那條線,你永遠不會發現問題。刪除它,讓錯誤拋出,看看發生了什麼。 – FreeMan
我已經故意說了。你看,如果單元格確實沒有任何先例,那麼「設置precedent_range = Cells(given_row,present_column).Precedents」會引發錯誤,並且它永遠不會進入「If-Then」條件。 –
這就是問題所在。你設置了OERN,但你永遠不會取消它 - 這就是爲什麼它使用這麼糟糕的原因之一 - 經常發生這種情況。之後的某個地方發生了一個錯誤,但是你已經把它掃到地毯下了。在這種情況下,你不需要它,因爲你的'Set Precedent_range'後面跟着'if precedent_range是Nothing ...' - 你已經正確地處理了這個錯誤。擺脫OERN並找出真正的錯誤。 – FreeMan