1

我正在尝试编写一个函数,该函数采用一系列数据并从用户提供的列中计算两个数字的比率。我想在行尾打印这个比率,但由于某种原因,我无法使用单元格函数引用行中的最后一个单元格。相反,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

更新

这是更新的代码:

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
4

3 回答 3

1

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

实际上,您需要做的就是添加set,没有它Varianttemp 将成为 a long,有了它 theVariant将成为一个Range对象。

于 2013-03-27T22:54:47.067 回答
1

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

更多信息在这里:

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

和这里:

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

通常,子程序可以操作工作表,而函数不能。

例外是从子例程中调用的函数可以,但是将函数用于除向子例程返回值之外的任何事情可能是一个坏习惯。

于 2013-03-27T23:47:28.547 回答
0

我假设您没有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 将确保您引用正确的列,暂时想不出一个会导致问题但最好是安全的示例。

于 2013-03-27T22:55:26.540 回答