提问人:BiGXERO 提问时间:5/24/2012 更新时间:5/24/2012 访问量:320
Excel 自定义函数更新不正确
Excel custom function incorrectly updating
问:
我正在尝试编写(我的第一个)自定义函数,该函数基本上将遍历报告以求和未来 1、3、6 个月(等)的机器成本
该函数返回值,但是,这些值不正确,更成问题的是,在包含自定义函数的单元格上加倍会更改使用自定义函数的周围单元格的值。
我正在处理的代码在这里:
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
单击单元格似乎可以移动值,但没有可识别的顺序。
谷歌搜索并查看了这里,但到目前为止似乎没有什么可以解决问题。
任何帮助将不胜感激!
答:
1赞
chris neilsen
5/24/2012
#1
一些提示和需要检查的事项:
- 不要使用模块范围的变量(除非需要与其他模块共享这些变量。即便如此,通常也有更好的方法)
- 除非你真的需要,否则不要使用 Volatile(我认为在这种情况下你不会这样做)
- 务必将所有范围作为参数传递到函数中
- 如果必须使用直接范围参照,请记住非限定参照,例如活动工作表上的范围。如果数据表未处于活动状态,则此 UDF 将返回意外结果。请改用类似的东西。但我再说一遍,将范围引用作为参数传递到函数中要好得多。
Range(...
Cell(...
Worksheets("Sheet1").Range(...
- 在设置变量之前,代码会引用该变量。
months
- 如果要从单元格调用公式中的 UDF,则尝试设置单元格值(如 中所示)将不起作用。这在您提供的链接中明确说明(您不能直接制作 VBA UDF 的第一点:列表)。另一方面,如果您从 a 调用 UDF 并将该 Sub 作为宏运行,它将起作用。
totalCosts = cost
Sub
如果您提供数据布局的完整详细信息以及您希望如何使用 UDF,我可以提供更具体的建议。
评论
0赞
BiGXERO
6/12/2012
我意识到我的代码计划是多么可怕。谢谢你的提醒。我试图在 UDF 中投入很多内容,并在我真的需要宏时真正尝试使用函数。非常感谢您的提醒,并为迟到的回复道歉
评论