单元格引用在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将确保您引用正确的列,不能想到一个例子,目前会导致问题,但更好是安全的。