单元格引用在Excel VBA 2010函数中不起作用

我正在尝试编写一个函数来获取一系列数据,并计算用户提供的列中两个数字的比例。 我想在行的末尾输出这个比例,但由于某些原因,我无法使用单元格函数引用行中的最后一个单元格。 相反,单元格function只是为我提供该单元格的值,而不是单元格地址。 我认为单元格function也提供了地址。 有人可以告诉我,如果这个错误或如果我的代码是错的?

这是代码

Function calculateRatio(table As Range, numerator As Integer, denominator As Integer, Optional nameOfRatio As String) On Error GoTo ExpectedError Dim num As Double Dim denom As Double Dim ratio As Double If table.Columns.Count < 2 Then MsgBox ("Not enough data. Requires at least two or more rows.") Exit Function End If If numerator < 1 Or numerator > table.Columns.Count Then MsgBox ("Not an acceptable Numerator. Must be greater than zero and less than " & table.Columns.Count) Exit Function End If If denominator < 1 Or denominator > table.Columns.Count Then MsgBox ("Not an acceptable Denominator. Must be greater than zero and less than " & table.Columns.Count) Exit Function End If For Counter = 1 To table.Rows.Count num = table.cells(Counter, numerator) denom = table.cells(Counter, denominator) ratio = num / denom temp = table.cells(counter, table.columns.count) temp.Offset(0, 1).Value = ratio Next Counter Exit Function ExpectedError: Call MsgBox("Something went wrong. Make sure you are referencing columns with numbers and not text." & Err.Number & " : " & Err.Description) End End Function 

UPDATE

这里是更新的代码:

 Function calculateRatio(table As Range, numerator As Integer, denominator As Integer, Optional nameOfRatio As String) Dim num As Double Dim denom As Double Dim ratio As Double Dim temp As Range Dim counter As Integer If table.Columns.Count < 2 Then MsgBox ("Not enough data. Requires at least two or more rows.") Exit Function End If If numerator < 1 Or numerator > table.Columns.Count Then MsgBox ("Not an acceptable Numerator. Must be greater than zero and less than " & table.Columns.Count) Exit Function End If If denominator < 1 Or denominator > table.Columns.Count Then MsgBox ("Not an acceptable Denominator. Must be greater than zero and less than " & table.Columns.Count) Exit Function End If For counter = 1 To table.Rows.Count num = table.cells(counter, numerator) denom = table.cells(counter, denominator) ratio = num / denom Set temp = table.cells(counter, table.Columns.Count) temp.Offset(0, 1).Value = ratio Next counter End Function 

无法从工作表中调用的UDF中操作工作表单元格。

更多信息在这里:

https://stackoverflow.com/a/15647054/1467082

和这里:

http://www.excel-it.com/UDF.htm

一般来说,子程序可以操作工作表,function不能。

例外是在一个子程序中调用的函数可以,但是这可能是一个坏的习惯,除了向子程序返回值以外的其他任何东西。

尝试添加Dim temp as Range ,chagne temp = table.cells(counter, table.columns.count) set temp = table.cells(counter, table.columns.count)

真的,所有你需要做的就是添加set ,没有它的Variant温度变得很long ,与Variant将成为一个Range对象。

我假设你没有在代码中使用Option Explicit

你需要声明“temp”作为一个范围。

 Dim temp As Range ' somewhere at the top of your function For Counter = 1 To table.Rows.Count ...... Set temp = table.cells(Counter, table.columns.count) ... Next 

如果你有单元坐标为什么不手动补偿它?

 table.cells(counter, table.Columns.Count+1).Value = ratio 

尝试这个:

 Function calculateRatio(table As Range, numerator As Integer, denominator As Integer, Optional nameOfRatio As String) Dim num As Double Dim denom As Double Dim ratio As Double Dim temp As Range Dim counter As Integer If table.Columns.Count < 2 Then MsgBox ("Not enough data. Requires at least two or more rows.") Exit Function End If If numerator < 1 Or numerator > table.Columns.Count Then MsgBox ("Not an acceptable Numerator. Must be greater than zero and less than " & table.Columns.Count) Exit Function End If If denominator < 1 Or denominator > table.Columns.Count Then MsgBox ("Not an acceptable Denominator. Must be greater than zero and less than " & table.Columns.Count) Exit Function End If For counter = 1 To table.Rows.Count num = table.cells(counter, numerator) denom = table.cells(counter, denominator) ratio = num / denom table.cells(counter, table.Columns(table.Columns.Count).Column + 1).Value = ratio 'Set temp = table.cells(counter, table.Columns.Count) 'temp.Offset(0, 1).Value = ratio Next counter End Function 

使用table.columns(table.columns.count).column将确保您引用正确的列,不能想到一个例子,目前会导致问题,但更好是安全的。