【问题标题】:Element wise array operations in VBA FunctionVBA 函数中的元素数组操作
【发布时间】:2020-08-21 03:59:30
【问题描述】:

我在 VBA 中创建了一个自定义函数,其输入是一个单元格值和三个相同长度的不同范围。代码或多或少如下:

Public Function MYTEST(CELLVALUE As Double, ByRef INPRNG As Range, ByRef RNG1 As Range, ByRef RNG2 As Range)
Dim i As Double
DIM A As Double
DIM B As Double
Dim MODRNG As Range

For i = LBound(INPRNG) To UBound(INPRNG)
    MODRNG(i) = INPRNG(i) * RNG1(i) + CELLVALUE * RNG2(i) 
Next i
A= MODRNG.Cells(1,1)
B= MODRNG.Cells(2,1)
mytest =A+B
End Function

我得到一个#VALUE!运行此代码时出错。 我的问题是三个方面:

  1. 是我的变量/范围声明不正确还是 For 循环导致了问题?
  2. 有没有办法使用 For Each 循环而不是 For Next?
  3. 我可以在我的 Excel 工作表中执行(for 循环的)数组操作并将修改后的数组发送到函数吗?

为了清楚起见,请查看快照。

谢谢!

【问题讨论】:

  • 你能举一个你输入数据的例子吗?如果您使用数学运算符(我假设它会返回一个数字),MODRNG 不应该是一个范围。
  • 所以数据看起来像: "A1:A4"={1,2,3,4} "B1:B4"={0,1,1,1} "C9"= 2 "D1:D4" = {​​1,0,0,0}。 For 循环运行后,最终结果应该是数组 MODRNG = {2,2,3,4}。我希望这是有道理的。
  • 您是要在一个单元格中输入此公式并更改 4 个单元格吗?
  • 不,函数的最终输出将是“A+B”,其中 A 和 B 的值将从数组 MODRNG 的特定值中分配。 MODRNG 的值是根据发送到函数的输入计算得出的。
  • 如果您在问题中添加显示特定输入和预期结果的屏幕截图会有所帮助。

标签: arrays excel vba function for-loop


【解决方案1】:

我不确定我是否理解您的目标,但这会为 MODRNG 抛出一个从第一和第二(单元格/数组位置)开始的数字。

Option Explicit
Public Function MYTEST(CELLVALUE As Double, ByRef INPRNG As Range, ByRef RNG1 As Range, ByRef RNG2 As Range) As Long

    Dim i As Double
    Dim A As Double
    Dim B As Double
    ReDim MODRNG(1 To INPRNG.Cells.Count)

    For i = 1 To INPRNG.Cells.Count
        MODRNG(i) = INPRNG(i) * RNG1(i) + CELLVALUE * RNG2(i)
    Next i
    A = MODRNG(1)
    B = MODRNG(2)
    MYTEST = A + B

End Function

想如果你只想要第一个和第二个值,我不明白你为什么要取大于 2 个单元格的范围。

【讨论】:

  • 谢谢,达米安,我会试试看它是否有效。我只使用两个变量来给读者一个大致的概念。我实际使用的是实际范围的值(总共 19 个)。这些单独的值用于执行复杂的数学运算。函数返回这个结果的值。
  • 那么请记住 Range 对象需要 Set 语句,并且用于设置 Ranges,因此如果您打算存储数字,则有效结果将是 Range("A1:A2"),使用数组,而不是像我在这里写的例子。然后,您可以使用Cells.Count 为范围指定与您的范围一样大的数组维度(如果它不是二维范围,这意味着多行多于 1 列,反之亦然)
  • 我仍然收到#VALUE!错误。我需要先声明MODRNG吗?还是 ReDim 同时定义了它?我尝试在 ReDim 之前使用 Dim MODRNG() 作为 Double。真的没有帮助。
  • 您能否编辑您的问题并添加完整代码以及输入数据和所需输出的屏幕截图?
  • 实际代码太长,因为里面有很多数学公式。我添加了数据点的快照。仅供参考,如果我在外部创建 MODRNG 并将单个数组输入发送到函数,则代码可以正常工作。这个查询与我之前问过的一个单独的问题有关link
猜你喜欢
  • 1970-01-01
  • 2010-12-15
  • 2020-08-19
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多