2012-05-24 55 views
0

我attemptinf寫(我第一次)的自定義功能,將基本循環通過一份報告,在未來的1,3,6個月之和機器的成本(ETC)Excel的自定義函數不正確地更新

的函數返回值,但是,這些值不正確,更有問題的包含自定義函數的單元格上的雙重更改使用自定義函數的周圍單元格的值。

,即時通訊處理的代碼是在這裏:

Option Explicit 

Dim months As Integer 'a month is considered as 30 days 
Dim cost As Long 
Dim FleetData As Range 
Dim rowCounter As Long 
Dim lastRow As Long 
Dim firstRow As Long 
Dim component As Range 
Dim dateOfAction As Range 
Dim totalApprox As Range 
Dim dateHorizon As Date 'Date to which the user wants to total the maintenance cost for 

Private Function totalCosts(xMonths As Range) 
'Dim totalCosts As Long 
Application.Volatile 

dateHorizon = Date + (30 * months) 

firstRow = [A10].Row 
rowCounter = firstRow 
lastRow = Range("A65000").End(xlUp).Row 
Set FleetData = [A10:S14] 

If IsNumeric(xMonths.Value) Then months = xMonths.Value Else 
If IsDate(xMonths.Value) Then months = (xMonths.Value - Date)/30 
cost = 0 
    Do While rowCounter < lastRow 
     Set component = Range(Cells(rowCounter, 1), Cells(rowCounter, 19)) 
     Set dateOfAction = Cells(rowCounter, 7) 
     Set totalApprox = Cells(rowCounter, 12) 
     If dateOfAction <= dateHorizon Then 
      cost = cost + totalApprox 
     End If 
     totalCosts = cost 
     rowCounter = rowCounter + 1 
    Loop 

End Function 

而且,即時通訊使用的數據是:

DateOfAction totalApprox 
5/07/2014 $30,068.62 
24/05/2005 $6,300.00 
5/07/2012 $29,742.00 
5/07/2012 $4,360.28 
27/12/2012 $5,555.89 

點擊一個細胞似乎遊移的值,但在沒有可識別訂購。

已經Google搜索,看起來here,但迄今沒有任何東西似乎解決了這個問題。

任何幫助將不勝感激!

回答

1

一些提示和檢查事項:

  1. 不要使用模塊範圍變量(除非你需要分享與其他模塊的變量,即便再有,通常是更好的方法。)
  2. 不要使用揮發性的,除非你真的需要(我不認爲你在這種情況下做的)
  3. 做你的範圍內傳遞到功能參數
  4. 如果必須使用直接引用的範圍,然後記住,不合格的引用,如Range(...Cell(...參考範圍有效紙張。如果您的數據表不活躍,則此UDF將返回意外的結果。改爲使用類似Worksheets("Sheet1").Range(...的東西。但我再說一遍,將範圍參考作爲參數傳遞給函數多了更好。
  5. 在設置之前,您的代碼引用變量months
  6. 如果您呼叫的UDF 從細胞在公式中,嘗試設置單元格的值(如在totalCosts = cost將無法​​正常工作。這在您提供的鏈接中明確聲明(的第一點您不能直接創建VBA UDF:列表)。另一方面,如果您從Sub調用UDF並將該Sub作爲宏運行,則它將工作。

如果您提供了數據佈局的全部細節以及如何使用UDF,我可以提供更具體的建議。

+0

我意識到我的代碼有多麼可怕。謝謝你的提醒。我試圖在UDF中付出很多努力,並且當我確實需要一個宏時嘗試使用一個函數。非常感謝您對最新回覆的提問和道歉 – BiGXERO