【问题标题】:Passing a row range to Excel User Define Function and assign it to an array将行范围传递给 Excel 用户定义函数并将其分配给数组
【发布时间】:2013-05-11 21:38:07
【问题描述】:

我正在尝试

  1. 将两个范围 - 多列单行 - 传递给 Excel 2007 中的用户定义函数,
  2. 然后将其分配给数组进行处理。

    Function MAE(actualData As Range, forecastData As Range) As Double

     Dim data
     Dim forecast
     Dim error As Double
     Dim average As Double
     Dim i As Long
    
     data = Application.Transpose(actualData)
     forecast = Application.Transpose(forecastData)
     average = 0
     error = 0
    
     For i = 1 To UBound(data)
    
       error = data(i) - forecast(i)
       If error < 0 Then
         error = error * -1
       End If
    
       average = error + average
    
     Next i
    
     MAE = average / UBound(data)
    
     End Function
    

我之前在这个论坛发过一个帖子,这里是link

在那个线程中,我询问了将单个列作为 Range 传递给用户定义的函数。根据您的建议,我修改了代码,当我通过两个单列时它运行良好。

但是当我通过两行时,它就不起作用了。我收到#Value 错误。对此有何建议?

【问题讨论】:

  • 感谢 KazJaw 的编辑,我将空格用于代码,但它不起作用。
  • 您不需要用户定义的函数来执行此计算。例如,如果A1:A8B1:B8 是您要比较的范围,您可以通过在工作表单元格中输入=AVERAGE(ABS(B1:B8-A1:A8)) 作为array formula 来计算平均绝对差值(即,通过按Ctrl+Shift +Enter 而不是在输入公式后仅 Enter)。
  • 非常感谢您节省了我的时间,这是一个很好的建议。我现在会使用它,但我仍然会尝试为此开发代码,看看它为什么不起作用。

标签: arrays excel vba range user-defined-functions


【解决方案1】:

您按索引引用变体的方式存在问题。

如果您在 Locals 窗口中查看,您可以看到该结构是每个 dataforecast 的二维数组,但您将它们称为一维数组,这将导致公式失败。

修改为:

error = data(i, 1) - forecast(i, 1)

这应该可以避免错误。

这是 Locals 窗口,它显示维度并让您浏览数组。

【讨论】:

  • 谢谢。 Application.Transpose 不是将其转换为一维数组吗?我从问题中链接的其他线程中得到了这个建议。可以使用 Application.Transpose 将列分配给数组,那么我该如何为行做同样的事情?
  • 尝试在forecast = Application.Transpose(forecastData) 之后添加另一个Transpose,然后执行:forecast = Application.Transpose(forecast)。这对我来说似乎可以转换为一维数组,尽管根据文档这似乎并不直观(或正确)。
猜你喜欢
  • 2013-04-03
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
相关资源
最近更新 更多