【问题标题】:Dynamic Range with Formula Array VBA具有公式数组 VBA 的动态范围
【发布时间】:2018-10-03 10:02:09
【问题描述】:

我对 VBA 中的公式数组有疑问。我试图在一系列单元格上运行一个公式,而我从中选择数据的范围正在循环中变化。我收到“FormulaArray 不适用于 Range 类”的错误。我试图将公式分成几部分,但没有运气。我猜这与我如何引用 Cells 有关?当公式使用R1C1 样式时效果很好,但在我使用Cells 时效果不佳。请注意,代码是从另一个工作表而不是实际工作表ws2

   Private Sub CommandButton4_Click()
       Dim ws2 As Worksheet
       Dim y_out As Range
       Dim y_in As Range
       Dim x_in As Range
       Dim x_out As Range
       Dim length As Long

       Set ws2 = Sheets("Sheet2")
       For i = 1 To datasets

                length = ws2.Cells(ws2.Rows.Count, i + 4).End(xlUp).Row

                Set y_out = ws2.Range(ws2.Cells(2, i * 4 + 2), ws2.Cells(length, i * 4 + 2))
                Set y_in = ws2.Range(ws2.Cells(2, i * 4 + 4), ws2.Cells(length, i * 4 + 4))
                Set x_in = ws2.Range(ws2.Cells(2, i * 4 + 3), ws2.Cells(length, i * 4 + 3))
                Set x_out = ws2.Range(ws2.Cells(2, i * 4 + 1), ws2.Cells(length, i * 4 + 1))

                y_out.FormulaArray = "=loess(x_in,y_in,x_out,50)"

                FormulaArray = "=loess(RC[1]:R[490]C[1],RC[2]:R[490]C[2],RC[-1]:R[490]C[-1],50)"


       Next i

    End Sub

【问题讨论】:

  • 你的 y_iny_out 重叠 - 这会导致循环引用。你有一个虚假的FormulaArray = _ 行,没有做任何应该被注释掉或删除的事情。 FormulaArray 属性只接受英文格式的函数(没有FormulaArrayLocalFormulaLocal 匹配),因此您应该使用逗号而不是分号来分隔您的参数,并使用英文名称而不是本地名称。 (什么是loess?)
  • y_iny_out 没有问题。这些变量是正确的,并且指的是它们各自的列。我将 Excel 设置为瑞典语,但 FormulaArray 在使用 R1C1 表示法时仍然有效。但我需要能够更改y_out 获取我的数据的列。我以前的代码有点误导,因为我的xy 变量没有随着循环而改变。 loess 是一个平滑 y_in 数据的函数。

标签: vba dynamic excel-formula


【解决方案1】:

似乎我实际上可以使用R1C1 符号和更少的代码行来解决它。由于R1C1 符号相对于活动单元格起作用,我只需要一种方法来使用" & length & " 将变量length 添加到公式中。它之所以有效,是因为y_out每次迭代后都会改变位置。

Private Sub CommandButton4_Click()

   Dim ws2 As Worksheet
   Dim y_out As Range
   Dim y_in As Range
   Dim x_in As Range
   Dim x_out As Range
   Dim length As Long

   Set ws2 = Sheets("Sheet2")
   For i = 1 To datasets

            length = ws2.Cells(ws2.Rows.Count, i + 4).End(xlUp).Row

            Set y_out = ws2.Range(ws2.Cells(2, i * 4 + 2), ws2.Cells(length, i * 4 + 2))


            y_out.FormulaArray = "=loess(RC[1]:R[" & length & "]C[1],RC[2]:R[" & length & "]C[2],RC[-1]:R[" & length & "]C[-1],50)"


   Next i

End Sub

【讨论】:

    【解决方案2】:

    x_iny_in 等不是命名范围,但您正试图像使用它们一样使用它们。

    这提供了 2 个解决方案:将它们命名为 Ranged(并相应地更改它)或使用它们的 .Address

    y_out.FormulaArray = "=loess(" & x_in.Address & ", " & y_in.Address & ", " & x_out.Address & " , 50)"
    

    【讨论】:

    • 我在发布我的答案之前没有看到您的答案,但我认为您可能是对的。你的答案实际上是我正在寻找的。正如我所提到的,我不太熟悉如何使用不同的符号。谢谢!
    • @Mattias .Address 函数实际上有一个名为 ReferenceStyle 的参数,它可以是 xlA1xlR1C1(默认为 xlA1) - 但是,为此,它没有它输出什么真的很重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多