[英]Cells reference not working in Excel VBA 2010 Function
我正在尝试编写一个函数,该函数需要一定范围的数据并从用户提供的列中计算两个数字的比率。 我想在行末打印出该比率,但是由于某些原因,我无法使用cells函数引用行中的最后一个单元格。 相反,“单元格”功能只是一直为我提供该单元格的值,而不是单元格地址。 我认为单元功能也可以提供地址。 有人可以告诉我这个错误还是我的代码错误?
这是代码
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
尝试将Dim temp as Range
添加Dim temp as Range
和chagne temp = table.cells(counter, table.columns.count)
以set temp = table.cells(counter, table.columns.count)
实际上,您需要做的就是添加set
,如果没有set
,则Variant
温度会变long
,并且Variant
会变成Range
对象。
无法通过从工作表调用的UDF操作工作表单元格。
此处有更多信息:
https://stackoverflow.com/a/15647054/1467082
和这里:
http://www.excel-it.com/UDF.htm
通常,子例程可以操纵工作表,而函数则不能。
唯一的例外是可以从子例程中调用函数,但是将函数用于将值返回到子例程以外的其他用途可能是个坏习惯。
我假设您在代码中没有使用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可以确保您引用的是正确的列,不会想到一个示例,该示例当前会引起问题,但是为了安全起见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.